У меня есть строка при вводе номера телефона - есть маска, поэтому она всегда выглядит так: "(123) 456-7890" - я бы хотел отформатировать форматирование, прежде чем сохранять его в БД.
Как я могу это сделать?
У меня есть строка при вводе номера телефона - есть маска, поэтому она всегда выглядит так: "(123) 456-7890" - я бы хотел отформатировать форматирование, прежде чем сохранять его в БД.
Как я могу это сделать?
Одна возможность использования linq:
string justDigits = new string(s.Where(c => char.IsDigit(c)).ToArray());
Добавление более чистой/более короткой версии благодаря crigmoliver
string justDigits = new string(s.Where(char.IsDigit).ToArray())
Вы можете использовать регулярное выражение для удаления всех нецифровых символов:
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
}
Так как никто не сделал цикл 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
Вы можете заставить его работать на этот номер с добавлением простой замены регулярных выражений, но я бы посмотрел на более высокие начальные цифры. Например, (876) 543-2019
будет переполнять целочисленную переменную.
string digits = Regex.Replace(formatted, @"\D", String.Empty, RegexOptions.Compiled);
Помимо всех других правильных ответов, сохранение телефонных номеров целыми числами или иное отключение форматирования может быть плохой идеей.
Вот несколько соображений:
(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]", " ");
Попробуйте следующее:
string s = "(123) 456-7890";
UInt64 i = UInt64.Parse(
s.Replace("(","")
.Replace(")","")
.Replace(" ","")
.Replace("-",""));
Вы должны быть в безопасности, так как ввод маскируется.
Вы можете использовать регулярное выражение, или вы можете перебирать каждый символ и использовать char.IsNumber.
Вам бы лучше использовать регулярные выражения. Int по определению является просто числом, но вы хотите, чтобы символы форматирования отображали номер телефона, который является строкой.
Существует множество сообщений о проверке номера телефона, см. Полное регулярное выражение для проверки номера телефона для стартеров.
Как уже упоминалось много ответов, перед тем, как попытаться разобрать номер, вам нужно сначала вычеркнуть символы, отличные от цифр. Вы можете сделать это, используя регулярное выражение.
Regex.Replace("(123) 456-7890", @"\D", String.Empty) // "1234567890"
Однако обратите внимание, что наибольшее положительное значение int может содержать 2 147 483 647, поэтому любое число с кодом области больше 214 приведет к переполнению. В этой ситуации вам лучше использовать долгое время.
Ведущие нули не будут проблемой для североамериканских чисел, так как коды областей не могут начинаться с нуля или одного.
Альтернативное использование Linq:
string phoneNumber = "(403) 259-7898";
var phoneStr = new string(phoneNumber.Where(i=> i >= 48 && i <= 57).ToArray());
Это в основном частный случай С#: удаление общих недопустимых символов из строки: улучшите этот алгоритм. Где ваш формат вкл. Белое пространство рассматривается как "плохие символы"
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
});
}