web-dev-qa-db-fra.com

Rechercher et extraire un nombre d'une chaîne

J'ai l'obligation de trouver et d'extraire un nombre contenu dans une chaîne.

Par exemple, à partir de ces chaînes:

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

Comment puis-je faire ceci?

248
van

\d+ est l'expression régulière d'un nombre entier. Alors 

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

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

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

466
Tim Pietzcker

Voici comment je nettoie les numéros de téléphone pour obtenir les chiffres uniquement:

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

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);
50
Sasha Reminnyi

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!");
}
36
Pranay Rana

Ce que j'utilise pour obtenir des numéros de téléphone sans aucune ponctuation ...

var phone = "(787) 763-6511";

string.Join("", phone.ToCharArray().Where(Char.IsDigit));

// result: 7877636511
27
ejcortes

Voici une version Linq:

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

Regex.Split peut extraire des nombres de chaînes. Vous obtenez tous les nombres qui se trouvent dans une chaîne. 

string input = "There are 4 numbers in this string: 40, 30, and 10.";
// Split on one or more non-digit characters.
string[] numbers = Regex.Split(input, @"\D+");
foreach (string value in numbers)
{
    if (!string.IsNullOrEmpty(value))
    {
    int i = int.Parse(value);
    Console.WriteLine("Number: {0}", i);
    }
}

Sortie:

Numéro 4 Nombre: 40 Nombre: 30 Nombre: 10

15
Tabares

Vous pouvez aussi essayer ceci

string.Join(null,System.Text.RegularExpressions.Regex.Split(expr, "[^\\d]"));
12
BvdVen

Une autre solution simple utilisant RegexVous devriez avoir besoin de cette 

using System.Text.RegularExpressions;

et le code est

string var = "Hello3453232wor705Ld";
string mystr = Regex.Replace(var, @"\d", "");
string mynumber = Regex.Replace(var, @"\D", "");
Console.WriteLine(mystr);
Console.WriteLine(mynumber);
11
user3001110

Utilisez simplement un RegEx pour faire correspondre la chaîne, puis convertissez:

Match match = Regex.Match(test , @"(\d+)");
if (match.Success) {
   return int.Parse(match.Groups[1].Value);
}
10
Daniel Gehriger

Voici une autre approche Linq qui extrait le premier nombre d'une chaîne. 

string input = "123 foo 456";
int result = 0;
bool success = int.TryParse(new string(input
                     .SkipWhile(x => !char.IsDigit(x))
                     .TakeWhile(x => char.IsDigit(x))
                     .ToArray()), out result);

Exemples:

string input = "123 foo 456"; // 123
string input = "foo 456";     // 456
string input = "123 foo";     // 123
7
fubo

Pour ceux qui veulent décimal nombre d'une chaîne avec Regex inTHEline:

decimal result = 0;
decimal.TryParse(Regex.Match(s, @"\d+").Value, out result);

Même chose pour float , long , etc ...

7
Richard Fu

La question ne dit pas explicitement que vous voulez juste les caractères de 0 à 9 mais il ne serait pas exagéré de croire que cela est vrai d'après votre exemple et vos commentaires. Donc, voici le code qui fait ça.

        string digitsOnly = String.Empty;
        foreach (char c in s)
        {
            // Do not use IsDigit as it will include more than the characters 0 through to 9
            if (c >= '0' && c <= '9') digitsOnly += c;
        }

Pourquoi vous ne souhaitez pas utiliser Char.IsDigit () - Les nombres incluent des caractères tels que des fractions, des indices, des indices supérieurs, des chiffres romains, des numérateurs de monnaie, des chiffres entourés et des chiffres spécifiques au script.

7
Atters

Vous pouvez le faire en utilisant la propriété String comme ci-dessous:

 return new String(input.Where(Char.IsDigit).ToArray()); 

qui ne donne que le nombre de chaîne.

6
Shyam sundar shah
var match=Regex.Match(@"a99b",@"\d+");
if(match.Success)
{
    int val;
    if(int.TryParse(match.Value,out val))
    {
        //val is set
    }
}
6
spender
var outputString = String.Join("", inputString.Where(Char.IsDigit));

Obtenez tous les nombres dans la chaîne. Donc, si vous utilisez par exemple '1 plus 2', vous obtiendrez '12'.

5
Tom
 string input = "Hello 20, I am 30 and he is 40";
 var numbers = Regex.Matches(input, @"\d+").OfType<Match>().Select(m => int.Parse(m.Value)).ToArray();
5
Ramireddy Ambati

Méthode d'extension pour obtenir tous les nombres positifs contenus dans une chaîne:

    public static List<long> Numbers(this string str)
    {
        var nums = new List<long>();
        var start = -1;
        for (int i = 0; i < str.Length; i++)
        {
            if (start < 0 && Char.IsDigit(str[i]))
            {
                start = i;
            }
            else if (start >= 0 && !Char.IsDigit(str[i]))
            {
                nums.Add(long.Parse(str.Substring(start, i - start)));
                start = -1;
            }
        }
        if (start >= 0)
            nums.Add(long.Parse(str.Substring(start, str.Length - start)));
        return nums;
    }

Si vous voulez aussi des nombres négatifs, modifiez simplement ce code pour qu'il gère le signe moins (-)

Compte tenu de cette entrée:

"I was born in 1989, 27 years ago from now (2016)"

La liste de numéros résultante sera:

[1989, 27, 2016]

L’inverse de l’une des réponses à cette question: Comment supprimer des nombres d’une chaîne à l’aide de Regex.Replace?

// Pull out only the numbers from the string using LINQ

var numbersFromString = new String(input.Where(x => x >= '0' && x <= '9').ToArray());

var numericVal = Int32.Parse(numbersFromString);
3
mwilly

voici ma solution

string var = "Hello345wor705Ld";
string alpha = string.Empty;
string numer = string.Empty;
foreach (char str in var)
{
    if (char.IsDigit(str))
        numer += str.ToString();
    else
        alpha += str.ToString();
}
Console.WriteLine("String is: " + alpha);
Console.WriteLine("Numeric character is: " + numer);
Console.Read();
1
user3001110

Une approche intéressante est fournie here par Ahmad Mageed, utilise Regex et stringbuilder pour extraire les entiers dans l’ordre dans lequel ils apparaissent dans la chaîne.

Voici un exemple d'utilisation de Regex.Split basé sur l'article d'Ahmad Mageed:

var dateText = "MARCH-14-Tue";
string splitPattern = @"[^\d]";
string[] result = Regex.Split(dateText, splitPattern);
var finalresult = string.Join("", result.Where(e => !String.IsNullOrEmpty(e)));
int DayDateInt = 0;

int.TryParse(finalresult, out DayDateInt);
1
Simba
  string verificationCode ="dmdsnjds5344gfgk65585";
            string code = "";
            Regex r1 = new Regex("\\d+");
          Match m1 = r1.Match(verificationCode);
           while (m1.Success)
            {
                code += m1.Value;
                m1 = m1.NextMatch();
            }
1
Manoj Gupta

si le nombre a une virgule décimale, vous pouvez utiliser ci-dessous

using System;
using System.Text.RegularExpressions;

namespace Rextester
{
    public class Program
    {
        public static void Main(string[] args)
        {
            //Your code goes here
            Console.WriteLine(Regex.Match("anything 876.8 anything", @"\d+\.*\d+").Value);
            Console.WriteLine(Regex.Match("anything 876 anything", @"\d+\.*\d+").Value);
            Console.WriteLine(Regex.Match("$876435", @"\d+\.*\d+").Value);
            Console.WriteLine(Regex.Match("$876.435", @"\d+\.*\d+").Value);
        }
    }
}

résultats :

"rien 876.8 rien" ==> 876.8

"rien 876 rien" ==> 876

"876435 $" ==> 876435

"876.435 $" ==> 876.435

Exemple: https://dotnetfiddle.net/IrtqVt

0
Tarek El-Mallah
string s = "kg g L000145.50\r\n";
        char theCharacter = '.';
        var getNumbers = (from t in s
                          where char.IsDigit(t) || t.Equals(theCharacter)
                          select t).ToArray();
        var _str = string.Empty;
        foreach (var item in getNumbers)
        {
            _str += item.ToString();
        }
        double _dou = Convert.ToDouble(_str);
        MessageBox.Show(_dou.ToString("#,##0.00"));
0

En utilisant @ tim-pietzcker , répondez d'en haut , ce qui suit fonctionnera pour PowerShell.

PS C:\> $str = '1 test'
PS C:\> [regex]::match($str,'\d+').value
1
0
user2320464
static string GetdigitFromString(string str)
    {
        char[] refArray = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
        char[] inputArray = str.ToCharArray();
        string ext = string.Empty;
        foreach (char item in inputArray)
        {
            if (refArray.Contains(item))
            {
                ext += item.ToString();
            }
        }
        return ext;
    }
0
Ruby Beginner

Voici mon algorithme

    //Fast, C Language friendly
    public static int GetNumber(string Text)
    {
        int val = 0;
        for(int i = 0; i < Text.Length; i++)
        {
            char c = Text[i];
            if (c >= '0' && c <= '9')
            {
                val *= 10;
                //(ASCII code reference)
                val += c - 48;
            }
        }
        return val;
    }
0
HS_Kernel

Vous devrez utiliser Regex comme \d+

\d correspond aux chiffres de la chaîne donnée.

0
Sachin Shanbhag