Как отформатировать строку в качестве номера телефона в 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". 

Хотя регулярное выражение может работать еще лучше, имейте в виду старую цитату программирования:

Некоторые люди, столкнувшись с проблемой, думают: «Я знаю, я буду использовать регулярные выражения». Теперь у них есть две проблемы.
– Джейми Завински, в 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); 

Насколько я знаю, вы не можете сделать это с помощью string.Format … вам придется самому справиться с этим. Вы можете просто удалить все нечисловые символы, а затем сделать что-то вроде:

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

Это предполагает, что данные введены правильно, и вы можете использовать регулярные выражения для проверки.

Я предлагаю это как чистое решение для номеров в США.

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

Если вы можете получить 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 , однако результат пользовательского интерфейса был разочаровывающим. Этот метод работает отлично, не заполняя цифры назад, как это String.Format решение String.Format . Просто примените форматтер к вашему значению 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 

Вы можете найти себя в ситуации, когда у вас есть пользователи, которые пытаются ввести номера телефонов со всеми видами разделителей между региональным кодом и блоком основных номеров (например, пробелы, тире, периоды, ect …). Таким образом, вы захотите полоса ввода всех символов, которые не являются номерами, чтобы вы могли стерилизовать ввод, с которым работаете. Самый простой способ сделать это – это выражение RegEx.

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

Тогда ответ, который вы указали, должен работать в большинстве случаев.

Чтобы ответить на вопрос о вашей проблеме с расширением, вы можете удалить все, что больше, чем ожидаемая длина десяти (для обычного номера телефона), и добавить это до конца, используя

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

Вы захотите выполнить проверку «если», чтобы определить, превышает ли длина вашего ввода более 10, прежде чем делать это, если нет, просто используйте:

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

Используйте Match в Regex для разделения, затем выведите форматированную строку с match.groups

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

Вы также можете попробовать следующее:

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

Следующее будет работать без использования регулярного выражения

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

Если мы не используем long.Parse, string.format не будет работать.

Чтобы решить проблему расширения, как насчет:

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

Не для того, чтобы воскресить старый вопрос, но подумал, что я могу предложить хотя бы несколько более простой в использовании метод, если немного сложнее настройки.

Поэтому, если мы создадим новый пользовательский форматтер, мы можем использовать более простое форматирование string.Format без необходимости конвертировать наш номер телефона в long

Поэтому сначала создадим пользовательский форматтер:

 using System; using System.Globalization; using System.Text; namespace System { ///  /// A formatter that will apply a format to a string of numeric values. ///  ///  /// The following example converts a string of numbers and inserts dashes between them. ///  /// 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) ///  ///  public class NumericStringFormatter : IFormatProvider, ICustomFormatter { ///  /// Converts the value of a specified object to an equivalent string representation using specified format and /// culture-specific formatting information. ///  /// A format string containing formatting specifications. /// An object to format. /// An object that supplies format information about the current instance. ///  /// The string representation of the value of , formatted as specified by ///  and . ///  ///  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(); } ///  /// Returns an object that provides formatting services for the specified type. ///  /// An object that specifies the type of format object to return. ///  /// An instance of the object specified by , if the ///  implementation can supply that type of object; otherwise, null. ///  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, – это часто у меня есть требования, позволяющие пользователям самим определять формат, и мне гораздо легче объяснить, как использовать этот формат, чем пытаться обучить пользовательское регулярное выражение.

Также имя classа является немного неправильным, поскольку оно действительно работает для форматирования любой строки, если вы хотите сохранить ее в том же порядке и просто вводить внутри нее символы.

Пожалуйста, используйте следующую ссылку для C # http://www.beansoftware.com/NET-Tutorials/format-string-phone-number.aspx

Самый простой способ сделать формат – использовать 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; } 

Передайте свой телефонNum в виде строки 2021231234 до 15 символов.

 FormatPhoneNumber(string phoneNum) 

Другим подходом было бы использование подстроки

 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; } 
Давайте будем гением компьютера.