问题
I have a string \"1112224444\' it is a telephone number. I want to format as 111-222-4444 before I store it in a file. It is on a datarecord and I would prefer to be able to do this without assigning a new variable.
I was thinking:
String.Format(\"{0:###-###-####}\", i[\"MyPhone\"].ToString() );
but that does not seem to do the trick.
** UPDATE **
Ok. I went with this solution
Convert.ToInt64(i[\"Customer Phone\"]).ToString(\"###-###-#### ####\")
Now its gets messed up when the extension is less than 4 digits. It will fill in the numbers from the right. so
1112224444 333 becomes
11-221-244 3334
Any ideas?
回答1:
Please note, this answer works with numeric data types (int, long). If you are starting with a string, you'll need to convert it to a number first. Also, please take into account that you'll need to validate that the initial string is at least 10 characters in length.
From a good page full of examples:
String.Format("{0:(###) ###-####}", 8005551212);
This will output "(800) 555-1212".
Although a regex may work even better, keep in mind the old programming quote:
Some people, when confronted with a problem, think “I know, I’ll use regular expressions.” Now they have two problems.
--Jamie Zawinski, in comp.lang.emacs
回答2:
I prefer to use regular expressions:
Regex.Replace("1112224444", @"(\d{3})(\d{3})(\d{4})", "$1-$2-$3");
回答3:
You'll need to break it into substrings. While you could do that without any extra variables, it wouldn't be particularly nice. Here's one potential solution:
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);
回答4:
I suggest this as a clean solution for US numbers.
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:
As far as I know you can't do this with string.Format ... you would have to handle this yourself. You could just strip out all non-numeric characters and then do something like:
string.Format("({0}) {1}-{2}",
phoneNumber.Substring(0, 3),
phoneNumber.Substring(3, 3),
phoneNumber.Substring(6));
This assumes the data has been entered correctly, which you could use regular expressions to validate.
回答6:
This should work:
String.Format("{0:(###)###-####}", Convert.ToInt64("1112224444"));
OR in your case:
String.Format("{0:###-###-####}", Convert.ToInt64("1112224444"));
回答7:
If you can get i["MyPhone"]
as a long
, you can use the long.ToString()
method to format it:
Convert.ToLong(i["MyPhone"]).ToString("###-###-####");
See the MSDN page on Numeric Format Strings.
Be careful to use long rather than int: int could overflow.
回答8:
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:
If your looking for a (US) phone number to be converted in real time. I suggest using this extension. This method works perfectly without filling in the numbers backwards. The String.Format
solution appears to work backwards. Just apply this extension to your string.
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;
}
回答10:
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
回答11:
You can also try this:
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;
}
Output:
回答12:
You may get find yourself in the situation where you have users trying to enter phone numbers with all sorts of separators between area code and the main number block (e.g., spaces, dashes, periods, ect...) So you'll want to strip the input of all characters that are not numbers so you can sterilize the input you are working with. The easiest way to do this is with a RegEx expression.
string formattedPhoneNumber = new System.Text.RegularExpressions.Regex(@"\D")
.Replace(originalPhoneNumber, string.Empty);
Then the answer you have listed should work in most cases.
To answer what you have about your extension issue, you can strip anything that is longer than the expected length of ten (for a regular phone number) and add that to the end using
formattedPhoneNumber = Convert.ToInt64(formattedPhoneNumber)
.ToString("###-###-#### " + new String('#', (value.Length - 10)));
You will want to do an 'if' check to determine if the length of your input is greater than 10 before doing this, if not, just use:
formattedPhoneNumber = Convert.ToInt64(value).ToString("###-###-####");
回答13:
Try this
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;
Cheers.
回答14:
Use Match in Regex to split, then output formatted string with 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();
回答15:
The following will work with out use of regular expression
string primaryContactNumber = !string.IsNullOrEmpty(formData.Profile.Phone) ? String.Format("{0:###-###-####}", long.Parse(formData.Profile.Phone)) : "";
If we dont use long.Parse , the string.format will not work.
回答16:
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;
}
Output will be :001-568-895623
回答17:
Please use the following link for C# http://www.beansoftware.com/NET-Tutorials/format-string-phone-number.aspx
The easiest way to do format is using Regex.
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;
}
Pass your phoneNum as string 2021231234 up to 15 char.
FormatPhoneNumber(string phoneNum)
Another approach would be to use 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;
}
回答18:
To take care of your extension issue, how about:
string formatString = "###-###-#### ####";
returnValue = Convert.ToInt64(phoneNumber)
.ToString(formatString.Substring(0,phoneNumber.Length+3))
.Trim();
回答19:
Not to resurrect an old question but figured I might offer at least a slightly easier to use method, if a little more complicated of a setup.
So if we create a new custom formatter we can use the simpler formatting of string.Format
without having to convert our phone number to a long
So first lets create the custom formatter:
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;
}
}
}
So then if you want to use this you would do something this:
String.Format(new NumericStringFormatter(),"{0:###-###-####}", i["MyPhone"].ToString());
Some other things to think about:
Right now if you specified a longer formatter than you did a string to format it will just ignore the additional # signs. For example this String.Format(new NumericStringFormatter(),"{0:###-###-####}", "12345");
would result in 123-45-
so you might want to have it take some kind of possible filler character in the constructor.
Also I didn't provide a way to escape a # sign so if you wanted to include that in your output string you wouldn't be able to the way it is right now.
The reason I prefer this method over Regex is I often have requirements to allow users to specify the format themselves and it is considerably easier for me to explain how to use this format than trying to teach a user regex.
Also the class name is a bit of misnomer since it actually works to format any string as long as you want to keep it in the same order and just inject characters inside of it.
回答20:
You can try {0: (000) 000-####} if your target number starts with 0.
来源:https://stackoverflow.com/questions/188510/how-to-format-a-string-as-a-telephone-number-in-c-sharp