在我的 C# 应用程序中,我使用正则表达式来验证美国电话号码的基本格式,以确保用户不只是输入虚假数据。然后,我去掉除数字之外的所有内容,所以:
(123) 456-7890 x1234
变成
12345678901234
在数据库中。但是,在我的应用程序的各个部分中,我想将此规范化的电话号码转换回
(123) 456-7890 x1234
做这种事情的最好方法是什么?(顺便说一句,不用担心国际电话号码格式。)
在我的 C# 应用程序中,我使用正则表达式来验证美国电话号码的基本格式,以确保用户不只是输入虚假数据。然后,我去掉除数字之外的所有内容,所以:
(123) 456-7890 x1234
变成
12345678901234
在数据库中。但是,在我的应用程序的各个部分中,我想将此规范化的电话号码转换回
(123) 456-7890 x1234
做这种事情的最好方法是什么?(顺便说一句,不用担心国际电话号码格式。)
String.Format("{0:(###) ###-#### x ###}", double.Parse("1234567890123"))
将导致 (123) 456-7890 x 123
使用正则表达式,您可以替换:
(\d{3})(\d{3})(\d{4})(\d{4})
和:
(\1) \2-\3 x\4
(虽然我不熟悉美国的电话号码,所以也许还有更多。)
我只会使用自定义格式字符串将数字转换回字符串:
class Program
{
static void Main(string[] args)
{
long phoneNumber = 12345678901234;
string phoneNumberString = String.Format("{0:(000) 000-0000 x0000}", phoneNumber);
Console.WriteLine(phoneNumberString);
}
}
当然,您可以将其分解为一个函数,该函数将电话号码作为一个长字符串,然后返回字符串(将格式加载或存储为方法中的常量,或适合您的情况)。
哦,如果你有一个字符串而不是长字符串,你可以轻松地将字符串转换为长字符串,然后将其传递给格式函数。当然,如果您重复执行此操作,则此处需要考虑性能(因为您正在迭代字符串以创建长字符串,然后将其转换回字符串,而您可以只使用子字符串)。
如果您只支持美国数字,您可以简单地格式化数字以在任何您想要的地方显示括号和 x。
我宁愿存储整个字符串,我会使用正则表达式对其进行解析以对其进行验证,然后将其存储在规范化的字符串中。
为了让它接受任何国家,我会这样做:
我会将 IDD 代码添加到所有电话号码,然后对来自该国家/地区的用户隐藏它。
所以: (123) 456-7890 x1234 将被存储为 +1 (123) 456-7890 x1234
(perl 兼容的)正则表达式类似于(完全未经测试且不起作用):
(+\d+)?\s+(((\d{,3}))(?\s+([-.0-9]{6,})\s+((x|ext\w*)\d{ ,4})
我将有一个用户数据库,包括国家和地区代码,然后自动填写以防他们丢失,该国家将有电话号码的默认数字分组约定(美国为 3,4)。
同一国家的用户不显示国际区号,同一国家和区号的用户不显示区号。完整的数字将显示在鼠标悬停上(HTML 标签?)
你必须为数据库分解它吗?如果没有,不要。如果您必须,那么您可以将不同的部分存储在不同的字段中(区域代码、前缀、订阅者编号、扩展名)。
或者,提取数字并开始解析。如果它只有 10 位数字,那么您就知道没有扩展名。超过 10 的所有数字,将它们粘贴在字符串中的“x”或其他内容之后。
我在一个 C++ 应用程序中做了类似的事情,我将存储的不同联系机制写为一个字符串,但是相反,我做了与你正在做的相反的事情。我从对话框中删除了字段,并构建了格式化的数字以存储为字符串。
这是一个可能有帮助的扩展方法:
public static string InsertStringAtPositions(this string str, string insertStr, IEnumerable<int> positions)
{
if (str != null && insertStr != null && positions != null)
{
string newString = string.Empty;
int previousPos = 0;
foreach (var pos in positions)
{
if (pos < str.Length)
{
newString += str.Substring(previousPos, pos - previousPos) + insertStr;
previousPos = pos;
}
}
if (positions.Last() < str.Length)
{
return newString + str.Substring(positions.Last(), str.Length - positions.Last());
}
return newString;
}
return str;
}
用法:
// Will convert "0399998888" to "03 9999 8888"
number.InsertStringAtPositions(" ", new[] {2, 6});