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

我有一个字符串“1112224444”这是一个电话号码。我想格式化为111-222-4444之前,我存储在一个文件。它位于数据记录中,我希望能够在不指定新变量的情况下完成此操作。

我在想:

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

但这似乎并不奏效。

更新

好吧,我采用了这个解决方案

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

现在,当分机号小于4位时,它就会变得一团糟。它将从右边填写数字。所以

1112224444 333  becomes


11-221-244 3334

有什么想法吗?

281192 次浏览

据我所知,用绳子是做不到的。格式... 你必须自己处理。你可以去掉所有的非数字字符,然后做一些像这样的事情:

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

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

你需要把它分解成子字符串。虽然 可以在没有任何额外变量的情况下执行此操作,但这并不特别好。这里有一个可能的解决办法:

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

如果你能得到 i["MyPhone"]作为一个 long,你可以使用 long.ToString()方法来格式化它:

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

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

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

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

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

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

来自 好页面的大量例子:

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


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

尽管正则表达式可能工作得更好,但请记住一句老话:

有些人,当面对一个 问题,想着“我知道,我会用 正则表达式。” 两个问题。
—— Jamie Zawinski,in comp.lang.emacs

使用 Regex 的 Match 进行分割,然后输出带有 Match. groups 格式的字符串

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

为了解决你的延期问题,不如这样做:

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

这应该会奏效:

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

或者在你的情况下:

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

试试这个

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 static string PhoneNumber(string value)
{
if (string.IsNullOrEmpty(value)) return string.Empty;
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;
}
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格式,而不必将我们的电话号码转换为 long

因此,首先让我们创建自定义格式化程序:

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.Format(new NumericStringFormatter(),"{0:###-###-####}", "12345");将导致123-45- 所以你可能需要在构造函数中加入一些可能的填充字符。

而且我也没有提供一种转义 # 符号的方法,所以如果你想在你的输出字符串中包含 # 符号,你就不能像现在这样做。

比起正则表达式,我更喜欢这种方法的原因是,我经常需要允许用户自己指定格式,而且对我来说,解释如何使用这种格式比教授用户正则表达式要容易得多。

另外,类名称有点用词不当,因为它实际上可以格式化任何字符串,只要你想让它保持相同的顺序,只需在其中注入字符即可。

如果不使用正则表达式,下面的代码也可以正常工作

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

如果我们不使用 long. Parse,string.format 将无法工作。

如果您寻找一个(美国)电话号码要实时转换。我建议用这个分机。这个方法不需要向后填写数字就可以很好地工作。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;
}

你也可以试试这个:

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

产出:

enter image description here

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

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

那么您列出的答案在大多数情况下应该是有效的。

为了回答你的分机问题,你可以去掉任何超过预期长度10的分机(对于一个普通的电话号码) ,然后使用

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

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

formattedPhoneNumber = Convert.ToInt64(value).ToString("###-###-####");

请使用下面的 C # 链接 Http://www.beansoftware.com/net-tutorials/format-string-phone-number.aspx

格式化最简单的方法是使用正则表达式。

private string FormatPhoneNumber(string phoneNum)
{
string phoneFormat = "(###) ###-#### x####";


Regex regexObj = new Regex(@"[^\d]");
phoneNum = regexObj.Replace(phoneNum, "");
if (phoneNum.Length > 0)
{
phoneNum = Convert.ToInt64(phoneNum).ToString(phoneFormat);
}
return phoneNum;
}

将 phoneNum 作为字符串2021231234传递到15个字符。

FormatPhoneNumber(string phoneNum)

另一种方法是使用 Substring

private string PhoneFormat(string phoneNum)
{
int max = 15, min = 10;
string areaCode = phoneNum.Substring(0, 3);
string mid = phoneNum.Substring(3, 3);
string lastFour = phoneNum.Substring(6, 4);
string extension = phoneNum.Substring(10, phoneNum.Length - min);
if (phoneNum.Length == min)
{
return $"({areaCode}) {mid}-{lastFour}";
}
else if (phoneNum.Length > min && phoneNum.Length <= max)
{
return $"({areaCode}) {mid}-{lastFour} x{extension}";
}
return phoneNum;
}

如果目标数字以0开头,可以尝试{0: (000)000-# # # }。

这是另一种做法。

public string formatPhoneNumber(string _phoneNum)
{
string phoneNum = _phoneNum;
if (phoneNum == null)
phoneNum = "";
phoneNum = phoneNum.PadRight(10 - phoneNum.Length);
phoneNum = phoneNum.Insert(0, "(").Insert(4,") ").Insert(9,"-");
return phoneNum;
}
        string phoneNum;
string phoneFormat = "0#-###-###-####";
phoneNum = Convert.ToInt64("011234567891").ToString(phoneFormat);
 Label12.Text = Convert.ToInt64(reader[6]).ToString("(###) ###-#### ");

这是我的例子! 我希望能帮助你。 问候

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

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

产出: (123-456-7890

下面是@Jon Skeet 的一个改进版本,带有空检查,并且有一个扩展方法。

public static string ToTelephoneNumberFormat(this string value, string format = "({0}) {1}-{2}") {
if (string.IsNullOrWhiteSpace(value))
{
return value;
}
else
{
string area = value.Substring(0, 3) ?? "";
string major = value.Substring(3, 3) ?? "";
string minor = value.Substring(6) ?? "";
return string.Format(format, area, major, minor);
}
}
static void Main(string[] args)
{
Regex phonenumber = new(@"([0-9]{11})$");
Console.WriteLine("Enter a Number: ");
var number = Console.ReadLine();
if(number.Length == 11)
{
if (phonenumber.IsMatch(number))
{
Console.WriteLine("Your Number is: "+number);
}
else
Console.WriteLine("Nooob...");
}
else
Console.WriteLine("Nooob...");
}