Joseph Herrera
Joseph Herrera

Reputation: 45

Clean string to have only numbers c#

I want to do have only the numbers from a string. I have tried this:

        string phoneNumber = txtPhoneNumber.Text;
        string cleanPhoneNumber = string.Empty;

        foreach (char c in phoneNumber)
        {
            if (c.Equals('0') || c.Equals('1') || c.Equals('2') || 
                c.Equals('3') || c.Equals('4') || c.Equals('5') ||
                c.Equals('6') || c.Equals('7') || c.Equals('8') || 
                c.Equals('9'))
                cleanPhoneNumber += Convert.ToString(c);
        }

The solution above worked, but i want to know if there is a more efficient way.

Upvotes: 1

Views: 1032

Answers (5)

Dmitrii Bychenko
Dmitrii Bychenko

Reputation: 186833

Since you, probable, want digits in 0..9 range only, not all unicode ones (which include Persian, Indian digits etc.), char.IsDigit and \d regular expression are not exact solutions.

Linq:

string cleanPhoneNumber = string.Concat(phoneNumber.Where(c => c >= '0' && c <= '9'));

Regex:

either Sami's, integer's codes or

resultString = Regex.Match(subjectString, @"\d+", RegexOptions.ECMAScript ).Value;

which is Krystian Borysewicz's solution with ECMAScript option to be on the safe side.

Upvotes: 3

Sami
Sami

Reputation: 3800

 string phoneNumber = txtPhoneNumber.Text;

// Get numbers only

 Regex numbersRegex = new Regex("[^0-9]");
 var cleanPhoneNumber = numbersRegex.Replace(phoneNumber, ""));

Upvotes: 1

NajiMakhoul
NajiMakhoul

Reputation: 1716

using Linq:

string cleanPhoneNumber = new String(phoneNumber.Where(Char.IsDigit).ToArray());

Upvotes: 0

Sean
Sean

Reputation: 62532

If you're looking to be efficient in terms on time then you should avoid using regex as the Regex class will need to parse your expression before it applies it to the phone number.

The code below avoid regex and keeps memory allocations to a minimum. It only allocates twice, once for a buffer to store the numbers and the once again at the end to create the string containing the valid numbers.

string Clean(string text)
{
    var validCharacters = new char[text.Length];
    var next = 0;

    for(int i = 0; i < text.Length; i++)
    {
        char c = text[i];
        if(char.IsDigit(c))
        {
            validCharacters[next++] = c;
        }
    }

    return new string(validCharacters, 0, next);
}

Upvotes: 0

Krystian Borysewicz
Krystian Borysewicz

Reputation: 779

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

Or use Regex

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

Upvotes: 2

Related Questions