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





Я не знаю другого способа, кроме как сделать это самостоятельно, возможно, сделав несколько масок и проверив, какая из них соответствует, и применив каждую маску в индивидуальном порядке. Не думайте, что это будет слишком сложно, просто отнимет время.
Я предполагаю, что вы могли бы сделать это с помощью условного оператора, чтобы просмотреть ввод, а затем проанализировать его в определенном формате. Но я предполагаю, что будет достаточно логики для исследования ввода и форматирования вывода.
Довольно простой подход - использовать регулярное выражение. В зависимости от того, какой тип телефонных номеров вы принимаете, вы можете написать регулярное выражение, которое ищет цифры (только для США, как вы знаете, может быть всего 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);
}
}
Я думаю, что проще всего сначала удалить все нечисловые символы из строки, чтобы у вас было просто число, а затем формат, как указано в этом вопрос
Я думал об удалении любых нечисловых символов, а затем о форматировании, но я не думаю, что это так хорошо работает для случая расширения (123.4567x123)
Отключите расширение, а затем удалите нечисловой символ из остатка. Отформатируйте его, затем снова добавьте расширение.
Start: 123.4567x123
Lop: 123.4567
Strip: 1234567
Format: 123-4567
Add: 123-4567 x123
У меня это работает. Стоит проверить производительность, если вы делаете это в жестком цикле ...
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;
}
Я думал об удалении любых нечисловых символов, а затем о форматировании, но я не думаю, что это так хорошо работает для случая расширения (123.4567x123)