Как отформатировать строку как номер телефона в C # - PullRequest
142 голосов
/ 09 октября 2008

У меня есть строка "1112224444", это телефонный номер. Я хочу отформатировать как 111-222-4444, прежде чем сохранить его в файле. Он находится на канале данных, и я бы предпочел сделать это без присвоение новой переменной.

Я думал:

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

но это, похоже, не помогает.

** ОБНОВЛЕНИЕ **

Ok. Я пошел с этим решением

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

Теперь его портят, когда расширение меньше 4 цифр. Это заполнит числа справа. так

1112224444 333  becomes

11-221-244 3334

Есть идеи?

Ответы [ 19 ]

183 голосов
/ 09 октября 2008

Обратите внимание, этот ответ работает с числовыми типами данных (int, long). Если вы начинаете со строки, вам нужно сначала преобразовать ее в число. Кроме того, примите во внимание, что вам нужно проверить, что длина начальной строки не менее 10 символов.

С хорошей страницы , полной примеров:

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

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

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

Некоторые люди, когда сталкиваются с проблема, подумайте «Я знаю, я буду использовать регулярные выражения ». Теперь у них есть две проблемы.
- Джейми Завински, в comp.lang.emacs

162 голосов
/ 09 октября 2008

Я предпочитаю использовать регулярные выражения:

Regex.Replace("1112224444", @"(\d{3})(\d{3})(\d{4})", "$1-$2-$3");
41 голосов
/ 09 октября 2008

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

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);
21 голосов
/ 09 октября 2008

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

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

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

20 голосов
/ 06 декабря 2011

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

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;
}
17 голосов
/ 06 октября 2010

Это должно работать:

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

ИЛИ в вашем случае:

String.Format("{0:###-###-####}", Convert.ToInt64("1112224444"));
14 голосов
/ 09 октября 2008

Если вы можете получить i["MyPhone"] как long, вы можете использовать метод long.ToString() для его форматирования:

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

См. Страницу MSDN Числовые строки формата .

Будьте внимательны при использовании long, а не int: int может переполниться.

5 голосов
/ 23 марта 2016

Если вы ищете (США) номер телефона для конвертации в режиме реального времени. Я предлагаю использовать это расширение. Этот метод отлично работает без заполнения чисел в обратном направлении. Решение 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;
}
5 голосов
/ 20 марта 2014
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
3 голосов
/ 05 декабря 2017

Вы можете оказаться в ситуации, когда у вас есть пользователи, пытающиеся ввести телефонные номера со всеми видами разделителей между кодом города и блоком основного номера (например, пробелы, тире, точки, т. Д.) Вы захотите убрать ввод всех символов, которые не являются числами, чтобы вы могли стерилизовать ввод, с которым вы работаете. Самый простой способ сделать это с помощью выражения 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("###-###-####");
...