Ради интереса мы можем сделать это:
return string.Format("{0:(###) ### - ####}",ulong.Parse(phone.Replace("-", "")));
Но я бы на самом деле удалил маску ввода .Да, используйте html / javascript, чтобы помочь пользователю вводить хорошие данные, но делайте это так, что это на 1006 * намного более допустимо.Если я введу 5551234567
, 555.123.4567
, (555)123-4567
или даже намного хуже, вы сможете справиться с любым из них.
Маски ввода обычно плохой UI / UX .
На C # я действительно разделил бы это на две части: нормализация , где я очищаю потенциально грязный ввод для хранения и проверки и форматирование ,где я беру нормализованные данные и форматирую их для отображения.Причина для двух шагов заключается в том, что зачастую с точки зрения хранения и индексации гораздо эффективнее хранить базовое (неформатированное) значение.Более того, иногда пользователи хотят видеть одни и те же данные, представленные по-разному.Теперь мне легко иметь разные параметры формата для одного и того же значения.Некоторые люди также включают проверка в качестве своей собственной фазы, но я хотел бы сделать это как часть нормализации данных.
Таким образом, для действительно базового номера телефона я бы обработалкод, подобный следующему:
public static string NormalizePhone(string phone)
{
// **We should give the user the benefit of the doubt.**
// I don't care what crazy format they used, if there are 10 digits, we can handle it.
//remove anything not a digit
var digits = Regex.Replace(phone, @"[^\d]", "");
//ensure exactly 10 characters remain
if (digits.Length != 10) throw new InvalidArgumentException($"{phone} is not a valid phone number in this system.");
return digits;
}
// Phone argument should be pre-normalized,
// because we want to be able to use this method with strings retrieved
// from storage without having to re-normalize them every time.
// Remember, you'll show a repeat value more often than you receive new values.
public static string FormatPhone(string phone)
{
//Even better if you have an Assert() here that can show phone is always pre-normalized in testing, but works to a no-op in production.
return Regex.Replace(phone, @"(\d{3})(\d{3})(\d{4})", "($1) $2 - $3");
}
Теперь ваш существующий код может вызывать их вместе:
try
{
FormatPhone(NormalizePhone(phone));
}
catch(InvalidArgumentException ex)
{
// This won't happen often.
// The html/js layer should stop it in most cases,
// such that we meet the rule of reserving exception handling for actual exceptional events.
// But you'll still want to add a meaningful handler here.
}
Но на самом деле я бы сам назвал NormalizePhone()
, чтобы подготовить это необработанное значение ксохраните запись пользователя, а затем FormatPhone()
, чтобы отобразить пользователя на экране.
Наконец, это упрощенный порт. Проверка действительного номера телефона может быть довольно сложной.Ссылка в значительной степени стандартная работа в этой области, и это колоссальные 12 МБ исходного кода.