2008-10-09 3 views
0

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

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

ответ

0

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

0

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

2

Довольно простой подход заключается в использовании регулярного выражения. В зависимости от того, какой тип телефонных номеров вы принимаете, вы можете написать регулярное выражение, которое ищет цифры (для US-only, вы знаете, что может быть 7 или 10 всего - возможно, с ведущим «1») и потенциальными разделителями между ними (период, тире, parens, пробелы и т. д.).

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

EDIT: Просто хотел добавить очень простой пример (ни в коем случае это не будет работать для всех приведенных выше примеров). Предложение Джеффа об исключении нечисловых символов может немного помочь в зависимости от того, как вы пишете свое регулярное выражение.

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

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

+0

Я думал о выкидывании нечисловых символов, а затем форматирования, но я не думаю, что так хорошо работает для расширение (123.4567x123) – 2008-10-10 12:54:32

1

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

1

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

Start: 123.4567x123 
Lop: 123.4567 
Strip: 1234567 
Format: 123-4567 
Add: 123-4567 x123 
0

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

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; 

}

Смежные вопросы