在我的 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);
    }
}

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

哦,如果你把它放在字符串中而不是长整型,你可以轻松地将字符串转换为长整型,然后将其传递给格式函数。当然,如果您重复执行此操作,则需要考虑性能(因为您正在迭代字符串以创建 long,然后将其转换回字符串,而您可以只使用子字符串)。

如果您仅支持美国号码,则只需将数字格式化即可在任意位置显示括号和 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 位数字的可选组
  • 然后是一个或多个空格
  • 然后是一组 6 个或更多数字、破折号或点
  • 然后是一个或多个空格
  • 然后是可选的 x 或以 ext 开头的单词(ext、extension ...)和一组最多 4 位数字

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

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

同一国家的用户不会显示国际代码,同一国家和区号的用户不会显示区号。鼠标悬停时将显示完整的数字(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});
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top