我有一个字符串"1112224444"它是一个电话号码.我想格式化为111-222-4444,然后将其存储在一个文件中.它在数据线上,我宁愿能够在不指定新的情况下执行此操作变量.
我刚在想:
String.Format("{0:###-###-####}", i["MyPhone"].ToString() );
但这似乎没有成功.
**更新**
好.我选择了这个解决方案
Convert.ToInt64(i["Customer Phone"]).ToString("###-###-#### ####")
现在,当扩展名小于4位时,它会搞砸.它将填写右边的数字.所以
1112224444 333 becomes 11-221-244 3334
有任何想法吗?
请注意,此答案适用于数字数据类型(int,long).如果您从字符串开始,则需要先将其转换为数字.另外,请注意您需要验证初始字符串的长度至少为10个字符.
从一个充满示例的好页面:
String.Format("{0:(###) ###-####}", 8005551212); This will output "(800) 555-1212".
虽然正则表达式可能会更好,但请记住旧的编程引用:
有些人在遇到问题时会想"我知道,我会使用正则表达式."现在他们有两个问题.
--Jamie Zawinski,comp.lang.emacs
我更喜欢使用正则表达式:
Regex.Replace("1112224444", @"(\d{3})(\d{3})(\d{4})", "$1-$2-$3");
你需要将它分解为子串.虽然你可以在没有任何额外变量的情况下做到这一点,但它并不是特别好.这是一个潜在的解决方案:
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);
我建议这是美国数字的清洁解决方案.
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做到这一点......你必须自己处理这个问题.您可以删除所有非数字字符,然后执行以下操作:
string.Format("({0}) {1}-{2}", phoneNumber.Substring(0, 3), phoneNumber.Substring(3, 3), phoneNumber.Substring(6));
这假定数据已正确输入,您可以使用正则表达式进行验证.
这应该工作:
String.Format("{0:(###)###-####}", Convert.ToInt64("1112224444"));
或者在你的情况下:
String.Format("{0:###-###-####}", Convert.ToInt64("1112224444"));
如果你能得到i["MyPhone"]
的long
,你可以使用long.ToString()
方法对其进行格式化:
Convert.ToLong(i["MyPhone"]).ToString("###-###-####");
请参阅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
如果您正在寻找实时转换的(美国)电话号码.我建议使用这个扩展名.这种方法可以完美地工作,而不会向后填充数字.该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; }