Форматирование номера телефона, OnBlur - PullRequest
0 голосов
/ 09 октября 2008

У меня есть текстовое поле .NET WinForms для поля номера телефона. После разрешения текста в свободной форме я хотел бы отформатировать текст как «более читаемый» номер телефона после того, как пользователь покинет текстовое поле. (Outlook имеет эту функцию для полей телефона при создании / редактировании контакта)

  • 1234567 становится 123-4567
  • 1234567890 становится (123) 456-7890
  • (123) 456,7890 становится (123) 456-7890
  • 123,4567x123 становится 123-4567 x123
  • и т.д.

Ответы [ 7 ]

2 голосов
/ 10 октября 2008

Довольно простой подход заключается в использовании регулярного выражения. В зависимости от того, какой тип телефонных номеров вы принимаете, вы можете написать регулярное выражение, которое ищет цифры (только для США, вы знаете, что может быть всего 7 или 10, возможно, с начальным '1') и потенциальными разделителями. между ними (точка, тире, парены, пробелы и т. д.).

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

РЕДАКТИРОВАТЬ: Просто хотел добавить очень простой пример (ни в коем случае это не будет работать для всех примеров, которые вы опубликовали выше). Предложение Джеффа об удалении нечисловых символов может немного помочь в зависимости от того, как вы пишете свое регулярное выражение.

Regex regex = new Regex(@"(?<areaCode>([\d]{3}))?[\s.-]?(?<leadingThree>([\d]{3}))[\s.-]?(?<lastFour>([\d]{4}))[x]?(?<extension>[\d]{1,})?");
string phoneNumber = "701 123-4567x324";

Match phoneNumberMatch = regex.Match(phoneNumber);
if(phoneNumberMatch.Success)
{
   if (phoneNumberMatch.Groups["areaCode"].Success)
   {
      Console.WriteLine(phoneNumberMatch.Groups["areaCode"].Value);
   }
   if (phoneNumberMatch.Groups["leadingThree"].Success)
   {
      Console.WriteLine(phoneNumberMatch.Groups["leadingThree"].Value);
   }
   if (phoneNumberMatch.Groups["lastFour"].Success)
   {
      Console.WriteLine(phoneNumberMatch.Groups["lastFour"].Value);
   }
   if (phoneNumberMatch.Groups["extension"].Success)
   {
      Console.WriteLine(phoneNumberMatch.Groups["extension"].Value);
   }
}
1 голос
/ 10 октября 2008

Отрежьте расширение, затем удалите нечисловой символ из остатка. Отформатируйте его, затем снова добавьте расширение.

Start: 123.4567x123
Lop: 123.4567
Strip: 1234567
Format: 123-4567
Add: 123-4567 x123
1 голос
/ 10 октября 2008

Я думал об удалении любых нечисловых символов и последующем форматировании, но я не думаю, что это хорошо работает для случая расширения (123.4567x123)

1 голос
/ 10 октября 2008

Я думаю, что самое простое, что нужно сделать - это сначала убрать любые нечисловые символы из строки, чтобы у вас было просто число, а затем отформатировать, как указано в этом вопросе

0 голосов
/ 13 июля 2009

Это работает для меня. Стоит проверить производительность, если вы делаете это в тесном цикле ...

public static string FormatPhoneNumber(string phone)
{
    phone = Regex.Replace(phone, @"[^\d]", "");
    if (phone.Length == 10)
        return Regex.Replace(phone,
                             "(?<ac>\\d{3})(?<pref>\\d{3})(?<num>\\d{4})",
                             "(${ac}) ${pref}-${num}");
    else if ((phone.Length < 16) && (phone.Length > 10))
        return Regex.Replace(phone,
                             "(?<ac>\\d{3})(?<pref>\\d{3})(?<num>\\d{4})(?<ext>\\d{1,5})", 
                             "(${ac}) ${pref}-${num} x${ext}");
    else
        return string.Empty;

}

0 голосов
/ 09 октября 2008

Я предполагаю, что вы могли бы выполнить это с помощью условного оператора, чтобы просмотреть входные данные и затем проанализировать их в определенном формате. Но я предполагаю, что будет достаточно логики для изучения ввода и форматирования вывода.

0 голосов
/ 09 октября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...