当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在C#中将字符串格式化为电话号码》经验,为你挑选了9个好方法。

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

我刚在想:

String.Format("{0:###-###-####}", i["MyPhone"].ToString() );

但这似乎没有成功.

**更新**

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

Convert.ToInt64(i["Customer Phone"]).ToString("###-###-#### ####")

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

1112224444 333  becomes

11-221-244 3334

有任何想法吗?



1> Sean..:

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

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

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

    This will output "(800) 555-1212".

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

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


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

2> Ryan Duffiel..:

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

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


如果我已经处理了一个字符串,正如海报所说的那样,把它投入很长时间再回来看起来很傻.
用于将数字保持为字符串的+1(假设用于自动SMS系统的电话号码通常必须以+44格式存储)
我想这可以工作,但.ToString()格式更容易阅读,应该更好.

3> Jon Skeet..:

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

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


我把它包装在`if(phone.Length == 10)`状态中.

4> Jerry Nixon..:

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

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



5> mattruma..:

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

string.Format("({0}) {1}-{2}",
     phoneNumber.Substring(0, 3),
     phoneNumber.Substring(3, 3),
     phoneNumber.Substring(6));

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


它假设一个北美电话号码

6> 小智..:

这应该工作:

String.Format("{0:(###)###-####}", Convert.ToInt64("1112224444"));

或者在你的情况下:

String.Format("{0:###-###-####}", Convert.ToInt64("1112224444"));


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

7> Joel Coehoor..:

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

Convert.ToLong(i["MyPhone"]).ToString("###-###-####");

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

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



8> underscore..:
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



9> James Copela..:

如果您正在寻找实时转换的(美国)电话号码.我建议使用这个扩展名.这种方法可以完美地工作,而不会向后填充数字.该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;
}

推荐阅读
手机用户2402852387
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有