[C#] Как отформатировать строку в качестве номера телефона в C #



Answers

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

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

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

Я думал:

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

но это не похоже на трюк.

** ОБНОВИТЬ **

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

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

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

1112224444 333  becomes

11-221-244 3334

Есть идеи?




Используйте Match в Regex для разделения, затем выведите форматированную строку с 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.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"));



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



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



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

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

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




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

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

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




Попробуй это

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;

Приветствия.




Links