格式化国际电话号码

时间:2014-01-29 12:15:39

标签: c# regex wpf

我有一个项目,我有一个电话号码的输入。所述电话号码可以来自任何国家。用户在输入电话号码之前选择了国家/地区。

当用户在WPF中输入电话号码时,有没有办法格式化电话号码?

我正在玩Google的C#库端口,但无济于事(click here

谢谢!

2 个答案:

答案 0 :(得分:1)

我建议你使用两个属性,在属性HomeNumber中使用正则表达式来格式化数字输入。

示例(更接近伪代码):

public string Country
{
    get { return country; }
    set { country = value; }
}

public string HomeNumber
{
    get
    {
        if (homeNumber == null)
        {
            return string.Empty;
        }

        if (country.Equals("USA"))
        {
            return Regex.Replace(homeNumber, @"(\d{2})(\d{2})(\d{2})", "$1-$2-$3");
        }
        else if (country.Equals("Russia"))
        {
            return Regex.Replace(homeNumber, @"(\d{3})(\d{2})(\d{2})", "$1-$2-$3");
        }
    }

    set
    {
        homeNumber = value;
    }
}

如果国家要选择很多,为了减少构造数量If,我建议使用State模式。

Advantages

  • 简单的解决方案
  • 不需要第三方库和项目

Disadvantages

  • 不是严重的缺陷,但在完成打印数字后会执行数字格式化。

答案 1 :(得分:0)

国际电话号码的定义很混乱,原因有以下三个:

1)如何拨打国际电话号码取决于您所在的国家/地区。如果您的应用程序仅在一个国家/地区使用,则还算不错。但是,可能有几种方法可以建立国际连接,例如先拨打00或直接拨打+。

2)电话号码的国家/地区代码设计得特别糟糕。只是一些例子:

1339美国
1340维尔京群岛(加勒比海群岛)
1341美国
1342未使用
1343加拿大

美国,加拿大和一些较小的地方共享1作为国家/地区代码,接下来的3位数字决定是美国还是加拿大还是... ...没有简单的方法来计算国家/地区,例如前xxx个是加拿大,其余的美国。

某些国家/地区具有2位数的代码,其他国家/地区则为3和4。

3)即使在同一国家/地区,不同地区的格式也可能不同。

最简单的解决方案可能是:

  1. 对国际和国内号码使用不同的格式
  2. 所有国际编号均使用+ ccc dddddddd格式,其中cc是长度可变的国家代码(!),而dddddddd是国家/地区内的数字
  3. 根据dddddddd使用的数字位数,您可以将它们写为ddd dd dd,dddd dddd和ddd ddd ddd。

当然,您也可以通过格式化国家/地区内的区号来进一步使其复杂化。我无法在区域方面为您提供帮助,但是对于其余部分,您可以在Github上找到代码(太多内容可在此处发布): github.com/PeterHuberSg/WpfWindowsLib/blob/master/WpfWindowsLib/PhoneTextBox.cs

有关国际电话号码和PhoneTextBox的详细说明,请参见CodeProject: International Phone Number Validation Explained