Подтвердить что ты не робот

Удалить форматирование из строки: "(123) 456-7890" => "1234567890"?

У меня есть строка при вводе номера телефона - есть маска, поэтому она всегда выглядит так: "(123) 456-7890" - я бы хотел отформатировать форматирование, прежде чем сохранять его в БД.

Как я могу это сделать?

4b9b3361

Ответ 1

Одна возможность использования linq:

string justDigits = new string(s.Where(c => char.IsDigit(c)).ToArray());

Добавление более чистой/более короткой версии благодаря crigmoliver

string justDigits = new string(s.Where(char.IsDigit).ToArray())

Ответ 2

Вы можете использовать регулярное выражение для удаления всех нецифровых символов:

string phoneNumber = "(123) 456-7890";
phoneNumber = Regex.Replace(phoneNumber, @"[^\d]", "");

Далее далее - в зависимости от ваших требований - вы можете либо сохранить номер в виде строки, либо как целое число. Чтобы преобразовать число в целочисленный тип, у вас будут следующие параметры:

// throws if phoneNumber is null or cannot be parsed
long number = Int64.Parse(phoneNumber, NumberStyles.Integer, CultureInfo.InvariantCulture);

// same as Int64.Parse, but returns 0 if phoneNumber is null
number = Convert.ToInt64(phoneNumber);

// does not throw, but returns true on success
if (Int64.TryParse(phoneNumber, NumberStyles.Integer, 
       CultureInfo.InvariantCulture, out number))
{
    // parse was successful
}

Ответ 3

Так как никто не сделал цикл for.

long GetPhoneNumber(string PhoneNumberText)
{
    // Returns 0 on error

    StringBuilder TempPhoneNumber = new StringBuilder(PhoneNumberText.Length);
    for (int i=0;i<PhoneNumberText.Length;i++)
    {
        if (!char.IsDigit(PhoneNumberText[i]))
            continue;

        TempPhoneNumber.Append(PhoneNumberText[i]);
    }

    PhoneNumberText = TempPhoneNumber.ToString();
    if (PhoneNumberText.Length == 0)
        return 0;// No point trying to parse nothing

    long PhoneNumber = 0;
    if(!long.TryParse(PhoneNumberText,out PhoneNumber))
        return 0; // Failed to parse string

    return PhoneNumber;
}

используется следующим образом:

long phoneNumber = GetPhoneNumber("(123) 456-7890"); 


Обновление
Как прокомментировал проспект, многие страны имеют нулевое значение в начале числа, если вам нужно это поддержать, тогда вам нужно вернуть строку недолго. Чтобы изменить мой код, выполните следующие действия:

1) Измените тип возвращаемой функции с длинной на строку.
2) Сделать функцию return null вместо 0 на ошибке
3) При успешном анализе заставьте его вернуть PhoneNumberText

Ответ 4

Вы можете заставить его работать на этот номер с добавлением простой замены регулярных выражений, но я бы посмотрел на более высокие начальные цифры. Например, (876) 543-2019 будет переполнять целочисленную переменную.

Ответ 5

string digits = Regex.Replace(formatted, @"\D", String.Empty, RegexOptions.Compiled);

Ответ 6

Помимо всех других правильных ответов, сохранение телефонных номеров целыми числами или иное отключение форматирования может быть плохой идеей.

Вот несколько соображений:

  • Пользователи могут предоставлять международные номера телефонов, которые не соответствуют вашим ожиданиям. См. эти примеры Таким образом, обычные группы для стандартных номеров США не подходят.
  • Пользователям может потребоваться предоставить расширение, например (555) 555-5555 ext#343 Клавиша # на самом деле находится на дозвонщике/телефоне, но не может быть закодирована в целое число. Пользователям также может потребоваться указать ключ *.
  • Некоторые устройства позволяют вставлять паузы (обычно с символом P), которые могут потребоваться для расширений или систем меню, или для набора в определенные телефонные системы (например, за рубежом). Они также не могут быть закодированы как целые числа.

[EDIT]

Может быть хорошей идеей хранить как целую версию, так и строчную версию в базе данных. Кроме того, при сохранении строк вы можете уменьшить всю пунктуацию до пробела, используя один из способов, описанных выше. Регулярным выражением для этого может быть:

// (222) 222-2222 ext# 333   ->   222 222 2222 # 333
phoneString = Regex.Replace(phoneString, @"[^\d#*P]", " ");

// (222) 222-2222 ext# 333   ->   2222222222333 (information lost)
phoneNumber = Regex.Replace(phoneString, @"[^\d]", "");

// you could try to avoid losing "ext" strings as in (222) 222-2222 ext.333 thus:
phoneString = Regex.Replace(phoneString, @"ex\w+", "#");
phoneString = Regex.Replace(phoneString, @"[^\d#*P]", " ");

Ответ 7

Попробуйте следующее:

string s = "(123) 456-7890";
UInt64 i = UInt64.Parse(
    s.Replace("(","")
     .Replace(")","")
     .Replace(" ","")
     .Replace("-",""));

Вы должны быть в безопасности, так как ввод маскируется.

Ответ 8

Вы можете использовать регулярное выражение, или вы можете перебирать каждый символ и использовать char.IsNumber.

Ответ 9

Вам бы лучше использовать регулярные выражения. Int по определению является просто числом, но вы хотите, чтобы символы форматирования отображали номер телефона, который является строкой.

Существует множество сообщений о проверке номера телефона, см. Полное регулярное выражение для проверки номера телефона для стартеров.

Ответ 10

Как уже упоминалось много ответов, перед тем, как попытаться разобрать номер, вам нужно сначала вычеркнуть символы, отличные от цифр. Вы можете сделать это, используя регулярное выражение.

Regex.Replace("(123) 456-7890", @"\D", String.Empty) // "1234567890"

Однако обратите внимание, что наибольшее положительное значение int может содержать 2 147 483 647, поэтому любое число с кодом области больше 214 приведет к переполнению. В этой ситуации вам лучше использовать долгое время.

Ведущие нули не будут проблемой для североамериканских чисел, так как коды областей не могут начинаться с нуля или одного.

Ответ 11

Альтернативное использование Linq:

string phoneNumber = "(403) 259-7898";
var phoneStr = new string(phoneNumber.Where(i=> i >= 48 && i <= 57).ToArray());

Ответ 13

public static string DigitsOnly(this string phoneNumber)
{
    return new string(
        new[]
            {
             // phoneNumber[0],     (
                phoneNumber[1],  // 6
                phoneNumber[2],  // 1
                phoneNumber[3],  // 7
             // phoneNumber[4],     )
             // phoneNumber[5],   
                phoneNumber[6],  // 8
                phoneNumber[7],  // 6
                phoneNumber[8],  // 7
             // phoneNumber[9],     -
                phoneNumber[10], // 5
                phoneNumber[11], // 3
                phoneNumber[12], // 0
                phoneNumber[13]  // 9
            });
}