电话号码格式化,OnBlur

问题描述:

我有一个用于电话号码字段的.NET WinForms文本框。在允许自由格式文本之后,我想在用户离开文本框后将文本格式设置为“更易读”的电话号码。 (Outlook有此功能,当您创建/编辑联系人电话字段)电话号码格式化,OnBlur

  • 1234567变得123-4567
  • 1234567890成为(123)456-7890
  • (123)456.7890变成(123)456 -7890
  • 123.4567x123变得123-4567 X123

我不知道的比可能使一些口罩和检查自己做其他任何方式哪一个匹配,并在每个案件的基础上做每个掩码。不要认为它太困难,只是费时。

我的猜测是你可以用条件语句来完成这个查看输入然后解析成特定格式。但我猜测将会有大量的逻辑来研究输入和格式化输出。

一个相当简单的方法是使用正则表达式。根据您接受的电话号码类型,您可以编写一个查找数字的正则表达式(仅适用于美国,您知道总共可以有7个或10个 - 可能带有一个前导'1')和潜在分隔符他们之间(周期,短跑,parens,空间等)。

一旦您对正则表达式运行匹配,您需要编写逻辑来确定您实际得到的内容并将其格式化。

编辑:只是想添加一个非常基本的例子(绝不是这将工作的所有上面张贴的例子)。根据您编写正则表达式的方式,Geoff建议删除非数字字符可能会有所帮助。

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); 
    } 
} 

我认为最简单的办法是首先从字符串中去掉任何非数字字符,这样你只需要一个号码,然后格式,在此question

+0

我想到了剥离非数字字符,然后格式化,但我不认为这么好了扩展案例(123.4567x123) – 2008-10-10 12:54:32

提到我想到了剥离任何非 - 数字字符然后格式化,但我不认为这对扩展案例效果很好(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; 

}