Trouver et extraire un nombre d'une chaîne

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

par exemple, de ces cordes:

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

Comment faire?

226
demandé sur David Sopko 2011-01-19 13:24:53

26 réponses

\d+ est le regex pour un nombre entier. So

//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 nombre.

443
répondu Tim Pietzcker 2015-09-11 06:57:45

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

string numericPhone = new String(phone.Where(Char.IsDigit).ToArray());
89
répondu Dave 2018-01-08 19:18:05

passez par la chaîne et utilisez 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);
49
répondu Sasha Reminnyi 2014-02-14 23:52:32

utiliser l'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!");
}
33
répondu Pranay Rana 2011-01-19 10:47:57

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
26
répondu ejcortes 2015-01-16 14:55:16

Regex.Split peut extraire des nombres à partir 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 Numéro: 40 Numéro: 30 Le numéro: 10

14
répondu Tabares 2013-10-15 20:11:18

Voici une Linq version:

string s = "123iuow45ss";
var getNumbers = (from t in s
                  where char.IsDigit(t)
                  select t).ToArray();
Console.WriteLine(new string(getNumbers));
14
répondu spajce 2014-02-14 23:52:49

vous pouvez également essayer ce

string.Join(null,System.Text.RegularExpressions.Regex.Split(expr, "[^\d]"));
12
répondu BvdVen 2014-05-11 09:08:48

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
répondu Daniel Gehriger 2011-01-19 10:29:54

une autre solution simple utilisant Regex Vous devez utiliser ce

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);
10
répondu 2014-01-18 11:03:08

la question ne dit pas explicitement que vous voulez juste les caractères 0 à 9 mais il ne serait pas exagéré de croire que c'est vrai à partir de vos exemples et 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 voulez pas utiliser Char.IsDigit () - les nombres comprennent des caractères tels que des fractions, des indices, des superscripts, des chiffres romains, des numérateurs de devises, des nombres encerclés et des chiffres spécifiques à un script.

7
répondu Atters 2015-01-18 18:26:46

Pour ceux qui veulent décimal le nombre à partir d'une chaîne avec Regex dans DEUX ligne:

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

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

7
répondu Richard Fu 2017-07-19 06:13:13
var match=Regex.Match(@"a99b",@"\d+");
if(match.Success)
{
    int val;
    if(int.TryParse(match.Value,out val))
    {
        //val is set
    }
}
6
répondu spender 2011-01-19 10:29:11

Voici une autre approche Linq qui extrait le premier numéro 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
6
répondu fubo 2016-09-28 06:35:12

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

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

qui ne donne que le nombre de la chaîne.

6
répondu Shyam sundar shah 2018-01-02 12:34:50
var outputString = String.Join("", inputString.Where(Char.IsDigit));

affiche tous les numéros dans la chaîne. Donc si vous l'utilisez pour examaple '1 + 2' get '12'.

4
répondu Tom 2015-09-16 14:21:53

méthode D'Extension pour obtenir tous les positifs nombres contenus dans une chaîne de caractères:

    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 des nombres négatifs aussi bien modifier simplement ce code pour manipuler le signe moins ( - )

étant donné cette entrée:

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

la liste des nombres résultante sera:

[1989, 27, 2016]
4
répondu Thomas C. G. de Vilhena 2016-05-24 19:08:48
 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();
4
répondu Ramireddy Ambati 2017-08-18 18:08:18

a fait le revers d'une des réponses à cette question: Comment supprimer des nombres de la chaîne en utilisant Regex.Remplacer?

// 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
répondu mwilly 2017-05-23 12:10:33
  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
répondu Manoj Gupta 2013-02-27 05:56:35

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
répondu 2014-01-18 10:39:04

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

exemple D'utilisation de Regex.Split basé sur le billet de Ahmad Mageed est le suivant:

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
répondu Simba 2018-05-02 20:11:37

vous devrez utiliser Regex comme \d+

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

0
répondu Sachin Shanbhag 2011-01-19 10:28:34
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
répondu Ruby Beginner 2013-01-13 00:43:24
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
répondu watcharachai unvijit 2016-01-19 07:25:46

basé sur le dernier échantillon j'ai créé une méthode:

    private string GetNumberFromString(string sLongString, int iLimitNumbers)
    {
        string sReturn = "NA";
        int iNumbersCounter = 0;
        int iCharCounter = 0; 

        string sAlphaChars = string.Empty;
        string sNumbers = string.Empty;
        foreach (char str in sLongString)
        {
            if (char.IsDigit(str))
            {
                sNumbers += str.ToString();
                iNumbersCounter++;
                if (iNumbersCounter == iLimitNumbers)
                {
                    return sReturn = sNumbers;
                }
            }
            else
            {
                sAlphaChars += str.ToString();
                iCharCounter++;
                // reset the counter 
                iNumbersCounter = 0; 
            }
        }
        return sReturn;
    }
-4
répondu MrJTNY 2014-12-26 16:34:04