如何在C#中将字符串格式化为电话号码

Bri*_*n G 153 c# string formatting phone-number

我有一个字符串"1112224444"它是一个电话号码.我想格式化为111-222-4444,然后将其存储在一个文件中.它在数据线上,我宁愿能够在不指定新的情况下执行此操作变量.

我刚在想:

String.Format("{0:###-###-####}", i["MyPhone"].ToString() );
Run Code Online (Sandbox Code Playgroud)

但这似乎没有成功.

**更新**

好.我选择了这个解决方案

Convert.ToInt64(i["Customer Phone"]).ToString("###-###-#### ####")
Run Code Online (Sandbox Code Playgroud)

现在,当扩展名小于4位时,它会搞砸.它将填写右边的数字.所以

1112224444 333  becomes

11-221-244 3334
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Sea*_*ean 193

请注意,此答案适用于数字数据类型(int,long).如果您从字符串开始,则需要先将其转换为数字.另外,请注意您需要验证初始字符串的长度至少为10个字符.

从一个充满示例的好页面:

String.Format("{0:(###) ###-####}", 8005551212);

    This will output "(800) 555-1212".
Run Code Online (Sandbox Code Playgroud)

虽然正则表达式可能会更好,但请记住旧的编程引用:

有些人在遇到问题时会想"我知道,我会使用正则表达式."现在他们有两个问题.
--Jamie Zawinski,comp.lang.emacs

  • 如果您的电话号码是字符串,这将无效,如问题所示,除非您先将其转换为数字值. (38认同)
  • 这是一个糟糕的实现,因为如果区号以0105555555或类似的方式开头,那么你最终会回到(01)555-5555而不是(010)555-5555.原因是,如果您将电话号码转换为数字,那么前面的零被视为不是任何东西,而当您格式化它时,前0会被删除. (11认同)
  • 我知道这只是重复上面的评论,但这个答案没有回答这个问题.如何将字符串格式化为特定格式,在本例中为电话号码格式. (4认同)
  • @Paul请阅读问题定义:"我有一个字符串"1112224444'这是一个电话号码.在将其存储在文件中之前,我希望格式化为111-222-4444". (3认同)

Rya*_*eld 164

我更喜欢使用正则表达式:

Regex.Replace("1112224444", @"(\d{3})(\d{3})(\d{4})", "$1-$2-$3");
Run Code Online (Sandbox Code Playgroud)

  • 如果我已经处理了一个字符串,正如海报所说的那样,把它投入很长时间再回来看起来很傻. (14认同)
  • 用于将数字保持为字符串的+1(假设用于自动SMS系统的电话号码通常必须以+44格式存储) (5认同)
  • 我想这可以工作,但.ToString()格式更容易阅读,应该更好. (4认同)
  • 我正在使用不同的格式(例如 (111) 222-4444、111.222.4444 等),但需要将它们标准化为 (111) 222-4444。我还想防止数字不完整并使用 _{n,m}_ 符号。(并且为格式道歉,但某些 MD 格式对我不起作用)。`// 删除非数字字符 var phoneDigits = Regex.Replace(crewMember.CellPhone, "[^\\d]", string.Empty); // 格式化数字 var phone = Regex.Replace(phoneDigits, @"(\d{1,3})(\d{0,3})(\d{0,4})", " ($1) $2 -$3");` (3认同)

Jon*_*eet 43

你需要将它分解为子串.虽然你可以在没有任何额外变量的情况下做到这一点,但它并不是特别好.这是一个潜在的解决方案:

string phone = i["MyPhone"].ToString();
string area = phone.Substring(0, 3);
string major = phone.Substring(3, 3);
string minor = phone.Substring(6);
string formatted = string.Format("{0}-{1}-{2}", area, major, minor);
Run Code Online (Sandbox Code Playgroud)

  • @MarkRogers:问题是“我想格式化为 111-222-4444” - 那里没有任何括号。 (3认同)
  • 我把它包装在`if(phone.Length == 10)`状态中. (2认同)

Jer*_*xon 23

我建议这是美国数字的清洁解决方案.

public static string PhoneNumber(string value)
{ 
    value = new System.Text.RegularExpressions.Regex(@"\D")
        .Replace(value, string.Empty);
    value = value.TrimStart('1');
    if (value.Length == 7)
        return Convert.ToInt64(value).ToString("###-####");
    if (value.Length == 10)
        return Convert.ToInt64(value).ToString("###-###-####");
    if (value.Length > 10)
        return Convert.ToInt64(value)
            .ToString("###-###-#### " + new String('#', (value.Length - 10)));
    return value;
}
Run Code Online (Sandbox Code Playgroud)


mat*_*uma 22

据我所知,你不能用string.Format做到这一点......你必须自己处理这个问题.您可以删除所有非数字字符,然后执行以下操作:

string.Format("({0}) {1}-{2}",
     phoneNumber.Substring(0, 3),
     phoneNumber.Substring(3, 3),
     phoneNumber.Substring(6));
Run Code Online (Sandbox Code Playgroud)

这假定数据已正确输入,您可以使用正则表达式进行验证.

  • 它假设一个北美电话号码 (4认同)

小智 19

这应该工作:

String.Format("{0:(###)###-####}", Convert.ToInt64("1112224444"));
Run Code Online (Sandbox Code Playgroud)

或者在你的情况下:

String.Format("{0:###-###-####}", Convert.ToInt64("1112224444"));
Run Code Online (Sandbox Code Playgroud)

  • 这是最好的解决方案.对于美国电话号码而言,领先的零点没有实际意义,因为没有美国区域代码以零或一个开头. (5认同)
  • 一个小问题,如果我使用01213456789其制造(12)345-6789 ...任何解决方案......? (3认同)

Joe*_*orn 14

如果你能得到i["MyPhone"]long,你可以使用long.ToString()方法对其进行格式化:

Convert.ToLong(i["MyPhone"]).ToString("###-###-####");
Run Code Online (Sandbox Code Playgroud)

请参阅MSDN页面 数字格式字符串.

小心使用long而不是int:int可能溢出.


und*_*ore 5

static string FormatPhoneNumber( string phoneNumber ) {

   if ( String.IsNullOrEmpty(phoneNumber) )
      return phoneNumber;

   Regex phoneParser = null;
   string format     = "";

   switch( phoneNumber.Length ) {

      case 5 :
         phoneParser = new Regex(@"(\d{3})(\d{2})");
         format      = "$1 $2";
       break;

      case 6 :
         phoneParser = new Regex(@"(\d{2})(\d{2})(\d{2})");
         format      = "$1 $2 $3";
       break;

      case 7 :
         phoneParser = new Regex(@"(\d{3})(\d{2})(\d{2})");
         format      = "$1 $2 $3";
       break;

      case 8 :
         phoneParser = new Regex(@"(\d{4})(\d{2})(\d{2})");
         format      = "$1 $2 $3";
       break;

      case 9 :
         phoneParser = new Regex(@"(\d{4})(\d{3})(\d{2})(\d{2})");
         format      = "$1 $2 $3 $4";
       break;

      case 10 :
         phoneParser = new Regex(@"(\d{3})(\d{3})(\d{2})(\d{2})");
         format      = "$1 $2 $3 $4";
       break;

      case 11 :
         phoneParser = new Regex(@"(\d{4})(\d{3})(\d{2})(\d{2})");
         format      = "$1 $2 $3 $4";
       break;

      default:
        return phoneNumber;

   }//switch

   return phoneParser.Replace( phoneNumber, format );

}//FormatPhoneNumber

    enter code here
Run Code Online (Sandbox Code Playgroud)


Jam*_*and 5

如果您正在寻找实时转换的(美国)电话号码.我建议使用这个扩展名.这种方法可以完美地工作,而不会向后填充数字.该String.Format解决方案似乎向后工作.只需将此扩展名应用于您的字符串.

public static string PhoneNumberFormatter(this string value)
{
    value = new Regex(@"\D").Replace(value, string.Empty);
    value = value.TrimStart('1');

    if (value.Length == 0)
        value = string.Empty;
    else if (value.Length < 3)
        value = string.Format("({0})", value.Substring(0, value.Length));
    else if (value.Length < 7)
        value = string.Format("({0}) {1}", value.Substring(0, 3), value.Substring(3, value.Length - 3));
    else if (value.Length < 11)
        value = string.Format("({0}) {1}-{2}", value.Substring(0, 3), value.Substring(3, 3), value.Substring(6));
    else if (value.Length > 10)
    {
        value = value.Remove(value.Length - 1, 1);
        value = string.Format("({0}) {1}-{2}", value.Substring(0, 3), value.Substring(3, 3), value.Substring(6));
    }
    return value;
}
Run Code Online (Sandbox Code Playgroud)


ati*_*ker 5

你也可以尝试这个:

  public string GetFormattedPhoneNumber(string phone)
        {
            if (phone != null && phone.Trim().Length == 10)
                return string.Format("({0}) {1}-{2}", phone.Substring(0, 3), phone.Substring(3, 3), phone.Substring(6, 4));
                return phone;
        }
Run Code Online (Sandbox Code Playgroud)

输出:

在此输入图像描述


小智 5

您可能会发现自己处于这样的情况:用户尝试输入区号和主号码块之间带有各种分隔符的电话号码(例如空格、破折号、句号等...),因此您需要删除输入中所有非数字字符,以便您可以对正在使用的输入进行消毒。最简单的方法是使用 RegEx 表达式。

string formattedPhoneNumber = new System.Text.RegularExpressions.Regex(@"\D")
    .Replace(originalPhoneNumber, string.Empty);
Run Code Online (Sandbox Code Playgroud)

那么您列出的答案应该适用于大多数情况。

要回答有关分机问题的问题,您可以删除任何超过预期长度 10(对于常规电话号码)的内容,然后使用以下命令将其添加到末尾

formattedPhoneNumber = Convert.ToInt64(formattedPhoneNumber)
     .ToString("###-###-#### " + new String('#', (value.Length - 10)));
Run Code Online (Sandbox Code Playgroud)

在执行此操作之前,您需要执行“if”检查以确定输入的长度是否大于 10,如果不大于,则只需使用:

formattedPhoneNumber = Convert.ToInt64(value).ToString("###-###-####");
Run Code Online (Sandbox Code Playgroud)


小智 5

使用字符串插值和新的数组索引/范围

var p = "1234567890";
var formatted = $"({p[0..3]}) {p[3..6]}-{p[6..10]}"
Run Code Online (Sandbox Code Playgroud)

输出:(123) 456-7890