[英]How to format a string as a telephone number in 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
有任何想法吗?
请注意,此答案适用于数字数据类型(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)
{
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;
}
据我所知,你不能用 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;
}
您可能会遇到这样的情况:您的用户试图输入电话号码,在区号和主号码块之间使用各种分隔符(例如,空格、破折号、句点等...),因此您需要去除所有非数字字符的输入,以便您可以对正在使用的输入进行消毒。 最简单的方法是使用 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("###-###-####");
string phoneNum;
string phoneFormat = "0#-###-###-####";
phoneNum = Convert.ToInt64("011234567891").ToString(phoneFormat);
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
使用字符串插值和新的数组索引/范围
var p = "1234567890";
var formatted = $"({p[0..3]}) {p[3..6]}-{p[6..10]}"
输出:(123) 456-7890
试试这个
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;
干杯。
在 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();
以下将不使用正则表达式
string primaryContactNumber = !string.IsNullOrEmpty(formData.Profile.Phone) ? String.Format("{0:###-###-####}", long.Parse(formData.Profile.Phone)) : "";
如果我们不使用 long.Parse , string.format 将不起作用。
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
请使用以下 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;
}
这是另一种方法。
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.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- 因此您可能希望在构造函数中使用某种可能的填充字符。
此外,我没有提供转义 # 符号的方法,因此如果您想将其包含在输出字符串中,您将无法像现在这样。
我更喜欢这种方法而不是 Regex 的原因是我经常要求允许用户自己指定格式,而且我解释如何使用这种格式比试图教用户 regex 容易得多。
此外,类名有点用词不当,因为它实际上可以格式化任何字符串,只要您想将其保持在相同的顺序并只在其中注入字符即可。
要解决您的扩展问题,请执行以下操作:
string formatString = "###-###-#### ####";
returnValue = Convert.ToInt64(phoneNumber)
.ToString(formatString.Substring(0,phoneNumber.Length+3))
.Trim();
如果您的目标号码以 0 开头,您可以尝试 {0: (000) 000-####}。
Label12.Text = Convert.ToInt64(reader[6]).ToString("(###) ###-#### ");
这是我的例子! 我希望能帮到你。 问候
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...");
}
这是@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);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.