377 votes

Trouver et extraire un nombre d'une chaîne de caractères

J'ai besoin de trouver et d'extraire un nombre contenu dans une chaîne de caractères.

Par exemple, à partir de ces chaînes de caractères :

string test = "1 test"
string test1 = " 1 test"
string test2 = "test 99"

Comment puis-je le faire ?

2 votes

Le chiffre pourrait-il être négatif ? Si c'est le cas, comment serait traité "Bonjour - comment allez-vous ? -30" ?

0 votes

Bonjour John, Pas de nombres négatifs dans les données

5 votes

Les nombres décimaux comme 1.5 ? La notation exponentielle comme 1.5E45 ?

639voto

Tim Pietzcker Points 146308

\d+ est la regex pour un nombre entier. Donc

//System.Text.RegularExpressions.Regex
resultString = Regex.Match(subjectString, @"\d+").Value;

renvoie une chaîne de caractères contenant la première occurrence d'un nombre dans subjectString .

Int32.Parse(resultString) vous donnera alors le numéro.

13 votes

Pour prendre en charge les nombres négatifs, vous pouvez utiliser Regex.Match(subjectString, @"-?\d+").Value au lieu de

0 votes

@JonList : L'OP a déclaré dans son commentaire ci-dessus qu'il ne cherche pas de chiffres négatifs, mais oui, ce serait possible si on le souhaite.

59 votes

Cette réponse n'est pas complète (en C#). Elle ne récupère que le premier chiffre de la chaîne. Vous devez itérer sur les correspondances : resultString = string.Join(string.Empty, Regex.Matches(subjectString, @" \d +").OfType<Match>().Select(m => m.Value)) ;

230voto

Dave Points 156

Voici comment je nettoie les numéros de téléphone pour n'avoir que les chiffres :

string numericPhone = new String(phone.Where(Char.IsDigit).ToArray());

35 votes

string numericPhone =new String(phone.Where(Char.IsDigit).ToArray());

2 votes

Solution très élégante.. J'aime l'utilisation de linq

1 votes

Belle solution pour les entiers ! Sachez que cela ne fonctionnera pas si vous essayez d'analyser un nombre décimal car le point décimal n'est pas un chiffre.

91voto

LexRema Points 1755

Parcourir la chaîne et utiliser Char.IsDigit

string a = "str123";
string b = string.Empty;
int val;

for (int i=0; i< a.Length; i++)
{
    if (Char.IsDigit(a[i]))
        b += a[i];
}

if (b.Length>0)
    val = int.Parse(b);

24 votes

@Thomas : Ce code ne fonctionne pas, il résulte avec b == "System.Linq.Enumerable.." . La solution correcte (et encore plus simple) serait la suivante b = String.Join("", a.Where(char.IsDigit))

1 votes

Bon point, ça m'apprendra à ne pas tester le code que j'écris en commentaire ! Vous pouvez également créer une chaîne à partir d'un tableau de caractères en utilisant la fonction new string(char[]) constructeur.

1 votes

Regex fait un bien meilleur travail.

42voto

Pranay Rana Points 69934

Utiliser une expression régulière ...

Regex re = new Regex(@"\d+");
Match m = re.Match("test 66");

if (m.Success)
{
    Console.WriteLine(string.Format("RegEx found " + m.Value + " at position " + m.Index.ToString()));
}
else
{
    Console.WriteLine("You didn't enter a string containing a number!");
}

16voto

spajce Points 4740

Voici un Linq version :

string s = "123iuow45ss";
var getNumbers = (from t in s
                  where char.IsDigit(t)
                  select t).ToArray();
Console.WriteLine(new string(getNumbers));

15 votes

Qu'en est-il simplement "123iuow45ss".AsEnumerable().Where(char.IsDigit) ?

2 votes

Je n'aime juste pas from t .. select t redondance, mais de toute façon, merci.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X