Find and extract a number from a string

C#.NetRegexString

C# Problem Overview


I have a requirement to find and extract a number contained within a string.

For example, from these strings:

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

How can I do this?

C# Solutions


Solution 1 - C#

\d+ is the regex for an integer number. So

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

returns a string containing the first occurrence of a number in subjectString.

Int32.Parse(resultString) will then give you the number.

Solution 2 - C#

Here's how I cleanse phone numbers to get the digits only:

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

Solution 3 - C#

go through the string and use 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);

Solution 4 - C#

use regular expression ...

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

Solution 5 - C#

What I use to get Phone Numbers without any punctuation...

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

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

// result: 7877636511

Solution 6 - C#

Regex.Split can extract numbers from strings. You get all the numbers that are found in a string.

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);
    }
}

Output:

> Number: 4 Number: 40 Number: 30 Number: 10

Solution 7 - C#

Here's a Linq version:

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

Solution 8 - C#

Another simple solution using Regex You should need to use this

using System.Text.RegularExpressions;

and the code is

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

Solution 9 - C#

if the number has a decimal points, you can use below

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);
        }
    }
}

results :

> "anything 876.8 anything" ==> 876.8 > > "anything 876 anything" ==> 876 > > "$876435" ==> 876435 > > "$876.435" ==> 876.435

Sample : https://dotnetfiddle.net/IrtqVt

Solution 10 - C#

You can also try this

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

Solution 11 - C#

Just use a RegEx to match the string, then convert:

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

Solution 12 - C#

Here is another Linq approach which extracts the first number out of a string.

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);

Examples:

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

Solution 13 - C#

You can do this using String property like below:

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

which gives only number from string.

Solution 14 - C#

 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();

Solution 15 - C#

For those who want decimal number from a string with Regex in TWO line:

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

Same thing applys to float, long, etc...

Solution 16 - C#

var match=Regex.Match(@"a99b",@"\d+");
if(match.Success)
{
	int val;
	if(int.TryParse(match.Value,out val))
	{
		//val is set
	}
}

Solution 17 - C#

The question doesn't explicitly state that you just want the characters 0 to 9 but it wouldn't be a stretch to believe that is true from your example set and comments. So here is the code that does that.

        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;
        }

Why you don't want to use Char.IsDigit() - Numbers include characters such as fractions, subscripts, superscripts, Roman numerals, currency numerators, encircled numbers, and script-specific digits.

Solution 18 - C#

var outputString = String.Join("", inputString.Where(Char.IsDigit));

Get all numbers in the string. So if you use for examaple '1 plus 2' it will get '12'.

Solution 19 - C#

Extension method to get all positive numbers contained in a string:

    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;
    }

If you want negative numbers as well simply modify this code to handle the minus sign (-)

Given this input:

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

The resulting numbers list will be:

[1989, 27, 2016]

Solution 20 - C#

An interesting approach is provided here by Ahmad Mageed, uses Regex and StringBuilder to extract the integers in the order in which they appear in the string.

An example using Regex.Split based on the post by Ahmad Mageed is as follows:

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);

Solution 21 - C#

Did the reverse of one of the answers to this question: https://stackoverflow.com/questions/1657282/how-to-remove-numbers-from-string-in-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);

Solution 22 - C#

  string verificationCode ="dmdsnjds5344gfgk65585";
            string code = "";
            Regex r1 = new Regex("\\d+");
          Match m1 = r1.Match(verificationCode);
           while (m1.Success)
            {
                code += m1.Value;
                m1 = m1.NextMatch();
            }

Solution 23 - C#

I have used this one-liner to pull all numbers from any string.

var phoneNumber = "(555)123-4567";
var numsOnly = string.Join("", new Regex("[0-9]").Matches(phoneNumber)); // 5551234567

Solution 24 - C#

Here is my Algorithm

    //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;
    }

Solution 25 - C#

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;
    }

Solution 26 - C#

here is my 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();

Solution 27 - C#

You will have to use Regex as \d+

\d matches digits in the given string.

Solution 28 - C#

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"));

Solution 29 - C#

Using @tim-pietzcker answer from above, the following will work for PowerShell.

PS C:\> $str = '1 test'
PS C:\> [regex]::match($str,'\d+').value
1

Solution 30 - C#

Using StringBuilder is slightly more performent than string concatanation in a loop. If you are dealing with large strings, it is considerably more performant.

    public static string getOnlyNumbers(string input)
    {
        StringBuilder stringBuilder = new StringBuilder(input.Length);
        for (int i = 0; i < input.Length; i++)
            if (input[i] >= '0' && input[i] <= '9')
                stringBuilder.Append(input[i]);

        return stringBuilder.ToString();
    }

Note: above example function only works for positive numbers

Solution 31 - C#

Here is another simple solution using Linq which extracts only the numeric values from a string.

var numbers = string.Concat(stringInput.Where(char.IsNumber));

Example:

var numbers = string.Concat("(787) 763-6511".Where(char.IsNumber));

Gives: "7877636511"

Solution 32 - C#

Based on the last sample I created a method:

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;
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionvanView Question on Stackoverflow
Solution 1 - C#Tim PietzckerView Answer on Stackoverflow
Solution 2 - C#DaveView Answer on Stackoverflow
Solution 3 - C#Sasha ReminnyiView Answer on Stackoverflow
Solution 4 - C#Pranay RanaView Answer on Stackoverflow
Solution 5 - C#ejcortesView Answer on Stackoverflow
Solution 6 - C#TabaresView Answer on Stackoverflow
Solution 7 - C#spajceView Answer on Stackoverflow
Solution 8 - C#user3001110View Answer on Stackoverflow
Solution 9 - C#Tarek El-MallahView Answer on Stackoverflow
Solution 10 - C#BvdVenView Answer on Stackoverflow
Solution 11 - C#Daniel GehrigerView Answer on Stackoverflow
Solution 12 - C#fuboView Answer on Stackoverflow
Solution 13 - C#Shyam sundar shahView Answer on Stackoverflow
Solution 14 - C#Ramireddy AmbatiView Answer on Stackoverflow
Solution 15 - C#Richard FuView Answer on Stackoverflow
Solution 16 - C#spenderView Answer on Stackoverflow
Solution 17 - C#AttersView Answer on Stackoverflow
Solution 18 - C#TomView Answer on Stackoverflow
Solution 19 - C#Thomas C. G. de VilhenaView Answer on Stackoverflow
Solution 20 - C#SimbaView Answer on Stackoverflow
Solution 21 - C#mwillyView Answer on Stackoverflow
Solution 22 - C#Manoj GuptaView Answer on Stackoverflow
Solution 23 - C#ReedView Answer on Stackoverflow
Solution 24 - C#HS_KernelView Answer on Stackoverflow
Solution 25 - C#Ruby BeginnerView Answer on Stackoverflow
Solution 26 - C#user3001110View Answer on Stackoverflow
Solution 27 - C#Sachin ShanbhagView Answer on Stackoverflow
Solution 28 - C#watcharachai unvijitView Answer on Stackoverflow
Solution 29 - C#user2320464View Answer on Stackoverflow
Solution 30 - C#t.m.View Answer on Stackoverflow
Solution 31 - C#BloggrammerView Answer on Stackoverflow
Solution 32 - C#MrJTNYView Answer on Stackoverflow