我有一个用于电话号码字段的.NET WinForms文本框。在允许自由格式文本之后,我想在用户离开文本框后将文本格式化为“更易读”的电话号码。 (Outlook在您创建/编辑联系人时为电话字段提供此功能)
答案 0 :(得分:2)
一种相当简单的方法是使用正则表达式。根据您接受的电话号码类型,您可以编写一个查找数字的正则表达式(仅限美国,您知道总共可以有7或10个 - 可能带有前导'1')和潜在的分隔符他们之间(句号,短划线,空格,空格等)。
一旦你对正则表达式运行匹配,你需要编写逻辑来确定你实际得到的东西并从那里格式化。
编辑:只是想添加一个非常基本的示例(绝不是这适用于您在上面发布的所有示例)。 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);
}
}
答案 1 :(得分:1)
我认为最简单的方法是首先从字符串中删除任何非数字字符,这样你就可以得到一个数字,然后按照question
中提到的那样格式化答案 2 :(得分:1)
我考虑过剥离任何非数字字符然后格式化,但我不认为这对扩展案例有效(123.4567x123)
答案 3 :(得分:1)
关闭扩展名,然后从剩余部分中删除非数字字符。格式化然后重新添加扩展名。
Start: 123.4567x123
Lop: 123.4567
Strip: 1234567
Format: 123-4567
Add: 123-4567 x123
答案 4 :(得分:0)
我不知道除了自己做任何其他方法,可能会制作一些面具并检查它匹配哪一个并根据具体情况做每个面具。不要以为它太难了,只是耗费时间。
答案 5 :(得分:0)
我的猜测是,您可以使用条件语句来查看输入,然后将其解析为特定格式。但我猜测调整输入并格式化输出会有很多逻辑。
答案 6 :(得分: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;
}