如何在C#中将string格式化为电话号码

我有一个string“1112224444”,它是一个电话号码,我想在格式化为111-222-4444之前,我把它存储在一个文件中,它在一个datarecord,我宁愿能够做到这一点,而不分配一个新的variables。

我刚在想:

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

但这似乎并没有诀窍。

**更新**

好。 我去了这个解决scheme

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

现在,当分机小于4位时,它会变得混乱。 它将填写右边的数字。 所以

 1112224444 333 becomes 11-221-244 3334 

有任何想法吗?

从一个很好的例子:

 String.Format("{0:(###) ###-####}", 8005551212); This will output "(800) 555-1212". 

虽然正则expression式可能更好,但请记住旧的编程语句:

有些人遇到问题时,会想“我知道,我会用正则expression式”,现在有两个问题。
–Jamie Zawinski,在comp.lang.emacs

我更喜欢使用正则expression式:

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

你需要把它分解成子string。 虽然你可以做到这一点,没有任何额外的变数,它不会特别好。 这是一个可能的解决scheme:

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

据我所知,你不能用string.Format来做这个事情,你必须自己处理。 你可以删除所有的非数字字符,然后做一些事情:

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

这假设数据input正确,您可以使用正则expression式进行validation。

我build议这是美国数字的干净解决scheme。

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

这应该工作:

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

或者在你的情况下:

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

如果您可以long获取i["MyPhone"] ,则可以使用long.ToString()方法对其进行格式化:

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

请参阅数字格式string上的MSDN页面。

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

 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 

如果您正在寻找要实时转换的电话号码。 我build议使用一个帮手。 我试着单独使用String.Format ,但UI结果令人失望。 这个方法完美的工作,没有像String.Format解决scheme那样向后填充数字。 只需将格式化程序应用到您的class级值。

 private string PhoneNumberFormatter(string value) { value = new Regex(@"\D").Replace(value, string.Empty); value = value.TrimStart('1'); if (value.Length > 0 & value.Length < 4) { value = string.Format("({0})", value.Substring(0, value.Length)); return value; } if (value.Length > 3 & value.Length < 7) { value = string.Format("({0}) {1}", value.Substring(0, 3), value.Substring(3, value.Length - 3)); return value; } if (value.Length > 6 & value.Length < 11) { value = string.Format("({0}) {1}-{2}", value.Substring(0, 3), value.Substring(3, 3), value.Substring(6)); return value; } 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; } return value; } 
 Function FormatPhoneNumber(ByVal myNumber As String) Dim mynewNumber As String mynewNumber = "" myNumber = myNumber.Replace("(", "").Replace(")", "").Replace("-", "") If myNumber.Length < 10 Then mynewNumber = myNumber ElseIf myNumber.Length = 10 Then mynewNumber = "(" & myNumber.Substring(0, 3) & ") " & myNumber.Substring(3, 3) & "-" & myNumber.Substring(6, 3) ElseIf myNumber.Length > 10 Then mynewNumber = "(" & myNumber.Substring(0, 3) & ") " & myNumber.Substring(3, 3) & "-" & myNumber.Substring(6, 3) & " " & myNumber.Substring(10) End If Return mynewNumber End Function 

在正则expression式中使用匹配来分割,然后用match.groups输出格式化的string

 Regex regex = new Regex(@"(?<first3chr>\d{3})(?<next3chr>\d{3})(?<next4chr>\d{4})"); Match match = regex.Match(phone); if (match.Success) return "(" + match.Groups["first3chr"].ToString() + ")" + " " + match.Groups["next3chr"].ToString() + "-" + match.Groups["next4chr"].ToString(); 

尝试这个

 string result; if ( (!string.IsNullOrEmpty(phoneNumber)) && (phoneNumber.Length >= 10 ) ) result = string.Format("{0:(###)###-"+new string('#',phoneNumber.Length-6)+"}", Convert.ToInt64(phoneNumber) ); else result = phoneNumber; return result; 

干杯。

 public string phoneformat(string phnumber) { String phone=phnumber; string countrycode = phone.Substring(0, 3); string Areacode = phone.Substring(3, 3); string number = phone.Substring(6,phone.Length); phnumber="("+countrycode+")" +Areacode+"-" +number ; return phnumber; } 

输出将是:001-568-895623

以下将使用正则expression式

 string primaryContactNumber = !string.IsNullOrEmpty(formData.Profile.Phone) ? String.Format("{0:###-###-####}", long.Parse(formData.Profile.Phone)) : ""; 

如果我们不使用long.Parse,则string.format将不起作用。

你也可以试试这个:

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

输出:

在这里输入图像说明

要照顾你的扩展问题,怎么样:

 string formatString = "###-###-#### ####"; returnValue = Convert.ToInt64(phoneNumber) .ToString(formatString.Substring(0,phoneNumber.Length+3)) .Trim(); 

不要复活一个旧的问题,但我想我可能会提供至less一个稍微更容易使用的方法,如果一点点复杂的设置。

所以,如果我们创build一个新的自定义格式化程序,我们可以使用更简单的string.Format格式,而不必将我们的电话号码转换为long

所以首先让我们创build自定义格式化程序:

 using System; using System.Globalization; using System.Text; namespace System { /// <summary> /// A formatter that will apply a format to a string of numeric values. /// </summary> /// <example> /// The following example converts a string of numbers and inserts dashes between them. /// <code> /// public class Example /// { /// public static void Main() /// { /// string stringValue = "123456789"; /// /// Console.WriteLine(String.Format(new NumericStringFormatter(), /// "{0} (formatted: {0:###-##-####})",stringValue)); /// } /// } /// // The example displays the following output: /// // 123456789 (formatted: 123-45-6789) /// </code> /// </example> public class NumericStringFormatter : IFormatProvider, ICustomFormatter { /// <summary> /// Converts the value of a specified object to an equivalent string representation using specified format and /// culture-specific formatting information. /// </summary> /// <param name="format">A format string containing formatting specifications.</param> /// <param name="arg">An object to format.</param> /// <param name="formatProvider">An object that supplies format information about the current instance.</param> /// <returns> /// The string representation of the value of <paramref name="arg" />, formatted as specified by /// <paramref name="format" /> and <paramref name="formatProvider" />. /// </returns> /// <exception cref="System.NotImplementedException"></exception> public string Format(string format, object arg, IFormatProvider formatProvider) { var strArg = arg as string; // If the arg is not a string then determine if it can be handled by another formatter if (strArg == null) { try { return HandleOtherFormats(format, arg); } catch (FormatException e) { throw new FormatException(string.Format("The format of '{0}' is invalid.", format), e); } } // If the format is not set then determine if it can be handled by another formatter if (string.IsNullOrEmpty(format)) { try { return HandleOtherFormats(format, arg); } catch (FormatException e) { throw new FormatException(string.Format("The format of '{0}' is invalid.", format), e); } } var sb = new StringBuilder(); var i = 0; foreach (var c in format) { if (c == '#') { if (i < strArg.Length) { sb.Append(strArg[i]); } i++; } else { sb.Append(c); } } return sb.ToString(); } /// <summary> /// Returns an object that provides formatting services for the specified type. /// </summary> /// <param name="formatType">An object that specifies the type of format object to return.</param> /// <returns> /// An instance of the object specified by <paramref name="formatType" />, if the /// <see cref="T:System.IFormatProvider" /> implementation can supply that type of object; otherwise, null. /// </returns> public object GetFormat(Type formatType) { // Determine whether custom formatting object is requested. return formatType == typeof(ICustomFormatter) ? this : null; } private string HandleOtherFormats(string format, object arg) { if (arg is IFormattable) return ((IFormattable)arg).ToString(format, CultureInfo.CurrentCulture); else if (arg != null) return arg.ToString(); else return string.Empty; } } } 

那么如果你想使用这个,你会做这样的事情:

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

其他一些事情要考虑:

现在,如果你指定了比格式化string更长的格式化程序,它将会忽略附加的#号。 例如,这个String.Format(new NumericStringFormatter(),"{0:###-###-####}", "12345"); 会导致123-45-所以你可能想在构造函数中使用某种可能的填充字符。

另外我没有提供逃避#符号的方法,所以如果你想把它包含在你的输出string中,那么你现在就不能这样做了。

我比Regex更喜欢这种方法的原因是我经常有要求允许用户自己指定格式,并且比解释用户正则expression式更容易解释如何使用这种格式。

此外,类名称有点用词不当,因为它实际上可以对任何string进行格式化,只要您想保持相同的顺序,并在其中注入字符即可。