带扩展名的String.Format电话号码

时间:2010-03-08 18:38:04

标签: c# string

我正在尝试创建一个格式化美国电话号码的功能 - 希望不会遍历每个数字。

当全部通过10位数时很好。超过10位数的传递方式 我希望String.Format方法在右侧追加扩展数字。例如:

当结果中传递的14位数字应为:(444)555-2222 x8888 当结果中传递的12位数字应为:(444)555-2222 x88 等等 然而,我目前的尝试得到的是: 传入12位数字会返回此字符串'() - 949 x555444433'

这是我到目前为止所拥有的。

public static string _FormatPhone(object phonevalue)
{
    Int64 phoneDigits;

    if (Int64.TryParse(phonevalue.ToString(), out phoneDigits))
    {
        string cleanPhoneDigits = phoneDigits.ToString();
        int digitCount = cleanPhoneDigits.Length;

        if (digitCount == 10)
            return String.Format("{0:(###) ###-####}", phoneDigits);
        else if (digitCount > 10)
            return String.Format("{0:(###) ###-#### x#########}", phoneDigits);
        else
            return cleanPhoneDigits;
    }

    return "Format Err#";
}

提前致谢。

6 个答案:

答案 0 :(得分:2)

我认为你必须将你的phoneDigits字符串分成前10位和其余的数字。

//[snip]
else if (phoneDigits.ToString().Length > 10)
        {
            return String.Format("{0:(###) ###-#### x}{1}", phoneDigits.Substring(0,10), phoneDigits.Substring(10) );
        }
//[snip]

答案 1 :(得分:1)

我建议将其视为一串数字,而不是数字。然后,您将明确使用Substring来分解部分。

答案 2 :(得分:1)

试着把它挤成1行,我想出了这个。

var phoneNumber = "(999) 555-4455 ext123";
phoneNumber = Regex.Replace(phoneNumber, "(.*?)([+]\\d{1,3})?(.*?)(\\d{3})(.*?)(\\d{3})(.*?)(\\d{4})([ ]+)?(x|ext)?(.*?)(\\d{2,5})?(.*?)$", "$2 $4 $6 $8 $10$12").Trim().Replace("ext","x");

如果它以+#开头,它将独自留下。然后它会查找数字块。 3,3,4然后它查找ext或x表示扩展名和另外2-5个数字。那时你可以随意格式化它,我选择了空格。

1234567890 - > '123 456 7890'

(123)456.7890 - > '123 456 7890'

+1 (999)555-4455 ext123 - > '+1 999 555 4455 x123'

答案 3 :(得分:0)

尝试使用正则表达式:

class Program
    {
        static void Main(string[] args)
        {
            var g = FormatUSPhone("444555222234");

        }

        public static string FormatUSPhone(string num)
        {
            string results = string.Empty;

            if(num.Length == 10)
            {
                num = num.Replace("(", "").Replace(")", "").Replace("-", "");
                const string formatPattern = @"(\d{3})(\d{3})(\d{4})";

                results = Regex.Replace(num, formatPattern, "($1) $2-$3");

            }else if (num.Length == 12)
            {
                num = num.Replace("(", "").Replace(")", "").Replace("-", "");
                const string formatPattern = @"(\d{3})(\d{3})(\d{4})(\d{2})";

                results = Regex.Replace(num, formatPattern, "($1) $2-$3 x$4");
            }

            return results;
        }

我从我发现here的例子中编辑了上述内容。玩上面的代码,看看它是否对你有帮助。

答案 4 :(得分:0)

使用正则表达式:

Regex usPhoneRegex = new Regex(@"(\d{3})(\d{3})(\d{4})(.*)", RegexOptions.IgnoreCase | RegexOptions.Compiled);
string USPhoneFormatString = "$1-$2-$3 x$4";
return usPhoneRegex.Replace("312588230012999", USPhoneFormatString));

主电话号码后的任何内容都将作为分机返回

由于您在代码中使用了int64,我的正则表达式假设电话号码中没有空格或标点符号。

- 编辑 - 艾哈迈德指出,我没有处理没有延期的号码的情况。所以这是一个使用MatchEvaluator来完成工作的修订版本。它比其他答案好吗?我不知道 - 但这是一种不同的方法,所以我想我会把它丢在那里。

Regex usPhoneRegex = new Regex(@"(\d{3})(\d{3})(\d{4})(.*)", RegexOptions.IgnoreCase | RegexOptions.Compiled);
return usPhoneRegex.Replace("3125882300", new MatchEvaluator(MyClass.formatPhone))

public static string formatPhone(Match m) {
  int groupIndex = 0;
  string results = string.Empty;
  foreach (Group g in m.Groups) {
    groupIndex +=1;
    switch (groupIndex) {
      case 2 : 
        results = g.Value;
        break;
      case 3 : 
      case 4 : 
        results += "-" + g.Value;
        break;
      case 5 :
        if (g.Value.Length != 0) {
          results += " x " + g.Value;
        }
        break;
    }
  }
  return results;
}

这可能应该使用StringBuilder。

答案 5 :(得分:0)

问题出在else if条件中,您有一定数量的#占位符来处理电话号码扩展名。相反,我们可以动态定义格式以考虑不同的长度。

你为什么要传递object?你到处都在使用ToString()。为什么不从一开始传入string?如果您传入的项目不是字符串,则在传入之前调用ToString,或将ToString()结果保存在方法中的变量中,如下所示。

以下是您的方法的更新版本:

public static string _FormatPhone(object phonevalue)
{
    string returnPhone = "Format Err#";

    Int64 phoneDigits;
    string phoneNumber = phonevalue.ToString();

    if (Int64.TryParse(phoneNumber, out phoneDigits))
    {
        if (phoneNumber.Length == 10)
        {
            return phoneDigits.ToString("(###) ###-####");
        }
        else if (phoneNumber.Length > 10)
        {
            // determine the length of placeholders needed for the format
            string format = "(###) ###-#### x"
                                + new string('#', phoneNumber.Length - 10);
            return phoneDigits.ToString(format);
        }
        else
        {
            return phoneNumber;
        }
    }

    return returnPhone;
}

测试它:

string[] inputs = { "456", "4445552222", "444555222288", "44455522226789" };
foreach (string input in inputs)
{
    Console.WriteLine("Format Result: " + _FormatPhone(input));
}

在这种情况下不需要正则表达式。如果你真的想使用一个,你的替换方法需要确定长度,以便在需要时附加扩展名,如下所示:

string[] inputs = { "456", "4445552222", "444555222288", "44455522226789" };
string pattern = @"(\d{3})(\d{3})(\d{4})(\d*)";
foreach (string input in inputs)
{
    string result = Regex.Replace(input, pattern, m =>
    {
        if (m.Value.Length >= 10)
        {
            return String.Format("({0}) {1}-{2}",
                m.Groups[1].Value, m.Groups[2].Value, m.Groups[3].Value)
                    + (m.Value.Length > 10 ? " x" + m.Groups[4].Value : "");
        }
        return m.Value;
    });
    Console.WriteLine("Regex result: " + result);
}