将规范化的电话号码转换为用户友好的版本

时间:2009-01-08 20:40:16

标签: c# regex formatting phone-number

在我的C#应用​​程序中,我使用正则表达式来验证美国电话号码的基本格式,以确保用户不仅仅输入虚假数据。然后,我删除了除数字之外的所有内容,所以这个:

  

(123)456-7890 x1234

变为

  

12345678901234

在数据库中。但是,在我的应用程序的各个部分中,我想将此标准化电话号码转换回

  

(123)456-7890 x1234

做这样事情的最佳方法是什么? (顺便说一下,不要担心会计国际电话号码格式。)

6 个答案:

答案 0 :(得分:9)

String.Format("{0:(###) ###-#### x ###}", double.Parse("1234567890123"))

将导致(123)456-7890 x 123

答案 1 :(得分:4)

使用正则表达式可以替换:

(\d{3})(\d{3})(\d{4})(\d{4})

使用:

(\1) \2-\3 x\4

(虽然我对美国的电话号码并不熟悉,但也许还有更多。)

答案 2 :(得分:2)

我只想使用自定义格式字符串将数字转换回字符串:

class Program
{
    static void Main(string[] args)
    {
        long phoneNumber = 12345678901234;
        string phoneNumberString = String.Format("{0:(000) 000-0000 x0000}", phoneNumber);
        Console.WriteLine(phoneNumberString);
    }
}

当然,您可以将其分解为一个函数,该函数将电话号码作为long,然后返回字符串(格式加载或存储为方法中的常量,或适合您的情况)。

哦,如果你有一个字符串而不是很长,你可以轻松地将字符串转换为long,然后将其传递给format函数。当然,如果你反复这样做,那么这里有性能方面的考虑因素(因为你正在迭代字符串来创建long,然后将它转换回字符串,当你可以使用substring时)。

答案 3 :(得分:1)

如果您只支持美国号码,您只需格式化数字即可在任何地方显示括号和x。

我更喜欢存储整个字符串,我会使用正则表达式对其进行解析以验证它,然后将其存储在规范化的字符串中。

为了让它接受任何国家,我会这样做:

我会将IDD代码添加到所有电话号码,然后将其隐藏在该国家/地区的用户之外。

所以:(123)456-7890 x1234将被存储为+1(123)456-7890 x1234

(perl兼容的)正则表达式(完全未经测试且不起作用):

(+ \ d +)\ S +(((\ d {3}))(\ S +([ - 0-9。] {6})\ S +((X |分机\ W *) \ d {4})

  • 这是一个以+
  • 开头的可选数字
  • 后跟一个或多个空格
  • 然后是括号之间最多3位数的可选组
  • 然后是一个或多个空格
  • 然后是一组6个或更多数字,破折号或点数
  • 然后是一个或多个空格
  • 然后是一个可选的x或以ext(ext,extension ...)开头的单词和一组最多4位

我会有一个用户数据库,包括国家和地区代码,然后自动填写,以防丢失,国家/地区会有电话号码的默认数字分组约定(美国为3,4)。< / p>

  • 所以,如果你在美国的123区,并输入456.7890,它将被解析为+1(123)4567890,你只能看到它为456-7890
  • 如果您在卡塔尔并输入号码4444555 extenshn 33,则会将其存储为+974 4444555 x33,您会将其视为4444555 x33

不会为同一国家/地区的用户显示国际代码,并且不会为同一国家/地区和区号的用户显示区号。完整的数字将显示在onmouseover(HTML标签?)

答案 4 :(得分:0)

你必须为数据库分解它吗?如果没有,不要。如果你必须,那么你可以将不同的部分存储在不同的字段中,(Areacode,Prefix,SubscriberNum,Extenion)。

或者,提取数字,然后开始解析。如果它只有10位数,那么你就知道没有扩展名。所有数字都超过10,在'x'之后将它们粘贴在字符串中。

我在C ++应用程序中做了类似的事情,我将存储的不同联系机制编写为单个字符串,但相反,我做了与你正在做的相反的事情。我从对话框中取出了字段,并构建了格式化的数字以存储为字符串。

答案 5 :(得分:0)

这是一个可能有帮助的扩展方法:

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