Vous devriez probablement utiliser IsDigitplutôt que IsNumber: "Cette méthode [ IsNumber] détermine si a Charappartient à une catégorie Unicode numérique. En plus d'inclure des chiffres, les nombres incluent des caractères, des fractions, des indices, des exposants, des chiffres romains, des numérateurs de devises et des nombres encerclés. Cette méthode contraste avec la IsDigitméthode, qui détermine si a Charest un chiffre de base à 10. " msdn.microsoft.com/en-us/library/yk2b3t2y.aspx
LukeH
2
@TrevorBrooks Supposons que vous puissiez simplement développer les termes:input.Where(c => char.IsDigit(c) || char.IsWhiteSpace(c))
Fredrik Mörk
6
On peut le simplifier davantage return new string(input.Where(char.IsDigit).ToArray());. Je le rend juste plus lisible
Zapnologica
2
Bonne réponse. Pourrait simplement envisager de renommer la fonction de «GetNumbers» en «GetDigits» également ... pour clarifier son intention.
JTech
2
Fait également une excellente méthode d'extension.
Roberto Bonini
61
Se sent comme un bon ajustement pour une expression régulière.
var s ="40,595 p.a.";var stripped =Regex.Replace(s,"[^0-9]","");
"[^0-9]"peut être remplacé par @"\D"mais j'aime la lisibilité de [^0-9].
Je serais d'accord tant que vous êtes d'accord avec la surcharge associée aux expressions régulières dans .Net
FrankO
4
Par curiosité, quelle est la surcharge de performance entre cette réponse et la réponse de Fredrik Mork?
Scuba Steve
C'est probablement plus lent, mais le seul moyen de le savoir est de mesurer, car cela dépend de la façon dont .NET implémente les expressions régulières, de la façon dont l'expression Lambda est compilée, etc.
Jonas Elfström
1
C'est plus flexible que d'utiliser IsDigit () car vous pouvez ajouter '.' caractères à l'expression régulière si vous souhaitez autoriser les nombres avec des décimales.
Richard Moore
10
J'ai fait une simple comparaison entre Regex et LINQ sur une chaîne construite à partir de 100 000 GUID réunis (résultant en une chaîne de 3 600 000 caractères). Regex était toujours autour d'une demi-seconde, alors que LINQ était toujours dans le 1/10 de seconde. Fondamentalement, LINQ était 5 fois ou plus plus rapide en moyenne.
Chris Pratt
8
Une méthode d'extension sera une meilleure approche:
publicstaticstringGetNumbers(thisstring text){
text = text ??string.Empty;returnnewstring(text.Where(p =>char.IsDigit(p)).ToArray());}
Je préfère if (text == null) return string.Empty;plus text = text ?? string.Empty;. De cette façon, nous ne diminuons pas les performances.
Hooman
6
Utilisez une expression régulière qui ne capture que 0-9 et rejette le reste. Une expression régulière est une opération qui coûtera cher la première fois. Ou faites quelque chose comme ça:
var sb =newStringBuilder();var goodChars ="0123456789".ToCharArray();var input ="40,595";foreach(var c in input){if(goodChars.IndexOf(c)>=0)
sb.Append(c);}var output = sb.ToString();
Quelque chose comme ça je pense, je n'ai pas compilé cependant ..
LINQ est, comme l'a dit Fredrik, également une option
cela fonctionnera pour moi après avoir autorisé les décimales.
John Lord il y a
0
Eh bien, vous savez quels sont les chiffres: 0123456789, non? Parcourez votre chaîne caractère par caractère; si le caractère est un chiffre, placez-le à la fin d'une chaîne temporaire, sinon ignorez. Il peut y avoir d'autres méthodes d'assistance disponibles pour les chaînes C #, mais c'est une approche générique qui fonctionne partout.
Que dois-je faire pour obtenir Regex Working obtenant cette erreur Le nom 'Regex' n'existe pas dans le contexte actuel
StevieB
using System.Text.RegularExpressions;
dhirschl
0
La réponse acceptée est excellente, mais elle ne prend pas en compte les valeurs NULL, ce qui la rend inutilisable dans la plupart des scénarios.
Cela m'a poussé à utiliser ces méthodes d'aide à la place. Le premier répond à l'OP, tandis que les autres peuvent être utiles pour ceux qui veulent effectuer le contraire:
/// <summary>/// Strips out non-numeric characters in string, returning only digits/// ref.: /programming/3977497/stripping-out-non-numeric-characters-in-string/// </summary>/// <param name="input">the input string</param>/// <param name="throwExceptionIfNull">if set to TRUE it will throw an exception if the input string is null, otherwise it will return null as well.</param>/// <returns>the input string numeric part: for example, if input is "XYZ1234A5U6" it will return "123456"</returns>publicstaticstringGetNumbers(string input,bool throwExceptionIfNull =false){return(input ==null&&!throwExceptionIfNull)? input
:newstring(input.Where(c =>char.IsDigit(c)).ToArray());}/// <summary>/// Strips out numeric and special characters in string, returning only letters/// </summary>/// <param name="input">the input string</param>/// <param name="throwExceptionIfNull">if set to TRUE it will throw an exception if the input string is null, otherwise it will return null as well.</param>/// <returns>the letters contained within the input string: for example, if input is "XYZ1234A5U6~()" it will return "XYZAU"</returns>publicstaticstringGetLetters(string input,bool throwExceptionIfNull =false){return(input ==null&&!throwExceptionIfNull)? input
:newstring(input.Where(c =>char.IsLetter(c)).ToArray());}/// <summary>/// Strips out any non-numeric/non-digit character in string, returning only letters and numbers/// </summary>/// <param name="input">the input string</param>/// <param name="throwExceptionIfNull">if set to TRUE it will throw an exception if the input string is null, otherwise it will return null as well.</param>/// <returns>the letters contained within the input string: for example, if input is "XYZ1234A5U6~()" it will return "XYZ1234A5U6"</returns>publicstaticstringGetLettersAndNumbers(string input,bool throwExceptionIfNull =false){return(input ==null&&!throwExceptionIfNull)? input
:newstring(input.Where(c =>char.IsLetterOrDigit(c)).ToArray());}
Réponses:
Il y a plusieurs façons, mais cela devrait faire (je ne sais pas comment cela fonctionne avec de très grosses chaînes):
la source
IsDigit
plutôt queIsNumber
: "Cette méthode [IsNumber
] détermine si aChar
appartient à une catégorie Unicode numérique. En plus d'inclure des chiffres, les nombres incluent des caractères, des fractions, des indices, des exposants, des chiffres romains, des numérateurs de devises et des nombres encerclés. Cette méthode contraste avec laIsDigit
méthode, qui détermine si aChar
est un chiffre de base à 10. " msdn.microsoft.com/en-us/library/yk2b3t2y.aspxinput.Where(c => char.IsDigit(c) || char.IsWhiteSpace(c))
return new string(input.Where(char.IsDigit).ToArray());
. Je le rend juste plus lisibleSe sent comme un bon ajustement pour une expression régulière.
"[^0-9]"
peut être remplacé par@"\D"
mais j'aime la lisibilité de[^0-9]
.la source
Une méthode d'extension sera une meilleure approche:
la source
if (text == null) return string.Empty;
plustext = text ?? string.Empty;
. De cette façon, nous ne diminuons pas les performances.Utilisez une expression régulière qui ne capture que 0-9 et rejette le reste. Une expression régulière est une opération qui coûtera cher la première fois. Ou faites quelque chose comme ça:
Quelque chose comme ça je pense, je n'ai pas compilé cependant ..
LINQ est, comme l'a dit Fredrik, également une option
la source
Une autre option ...
la source
la source
Eh bien, vous savez quels sont les chiffres: 0123456789, non? Parcourez votre chaîne caractère par caractère; si le caractère est un chiffre, placez-le à la fin d'une chaîne temporaire, sinon ignorez. Il peut y avoir d'autres méthodes d'assistance disponibles pour les chaînes C #, mais c'est une approche générique qui fonctionne partout.
la source
Voici le code utilisant des expressions régulières:
la source
La réponse acceptée est excellente, mais elle ne prend pas en compte les valeurs NULL, ce qui la rend inutilisable dans la plupart des scénarios.
Cela m'a poussé à utiliser ces méthodes d'aide à la place. Le premier répond à l'OP, tandis que les autres peuvent être utiles pour ceux qui veulent effectuer le contraire:
Pour plus d'informations, lisez cet article sur mon blog.
la source
la source