String.Format Номера телефонов с расширением - PullRequest
6 голосов
/ 08 марта 2010

Я пытаюсь создать функцию, которая форматирует телефонные номера в США - надеюсь, не просматривая каждую цифру.

Когда передаются 10 цифр, все в порядке. Как бы то ни было, когда передается более 10 цифр Я хочу, чтобы метод String.Format добавлял цифры расширения справа. Например:

Если в результате передано 14 цифр: (444) 555-2222 x8888 Если передано 12 цифр, результат должен быть: (444) 555-2222 x88 и т.п. Однако, что я получаю с моей текущей попыткой: Передача в 12 цифр возвращает эту строку '() -949 x555444433'

вот что у меня есть.

public static string _FormatPhone(object phonevalue)
{
    Int64 phoneDigits;

    if (Int64.TryParse(phonevalue.ToString(), out phoneDigits))
    {
        string cleanPhoneDigits = phoneDigits.ToString();
        int digitCount = cleanPhoneDigits.Length;

        if (digitCount == 10)
            return String.Format("{0:(###) ###-####}", phoneDigits);
        else if (digitCount > 10)
            return String.Format("{0:(###) ###-#### x#########}", phoneDigits);
        else
            return cleanPhoneDigits;
    }

    return "Format Err#";
}

Заранее спасибо.

Ответы [ 6 ]

2 голосов
/ 08 марта 2010

Я думаю, вам придется разбить строку phoneDigits на первые 10 цифр и остаток.

//[snip]
else if (phoneDigits.ToString().Length > 10)
        {
            return String.Format("{0:(###) ###-#### x}{1}", phoneDigits.Substring(0,10), phoneDigits.Substring(10) );
        }
//[snip]
1 голос
/ 07 апреля 2016

Пытаясь втиснуть его в 1 строку, я придумал это.

var phoneNumber = "(999) 555-4455 ext123";
phoneNumber = Regex.Replace(phoneNumber, "(.*?)([+]\\d{1,3})?(.*?)(\\d{3})(.*?)(\\d{3})(.*?)(\\d{4})([ ]+)?(x|ext)?(.*?)(\\d{2,5})?(.*?)$", "$2 $4 $6 $8 $10$12").Trim().Replace("ext","x");

Если он начинается с + #, он останется один. Затем он будет искать блоки чисел. 3,3,4, то он ищет ext или x для расширения и еще 2-5 чисел. В этот момент вы можете отформатировать его как угодно, я выбрал пробелы.

1234567890 -> '123 456 7890'

(123) 456,7890 -> 123 456 7890

+ 1 (999)555-4455 ext123 -> '+1 999 555 4455 x123'

1 голос
/ 08 марта 2010

Я бы посоветовал рассматривать его как последовательность цифр, а не как число. Затем вы бы явно использовали Substring, чтобы разбить части.

0 голосов
/ 08 марта 2010

Проблема заключается в вашем else if состоянии, когда у вас есть установленное количество # заполнителей для обработки добавочного номера телефона. Вместо этого мы можем определить формат динамически для учета различной длины.

Почему вы проходите в object? Вы используете ToString() повсюду. Почему бы не передать string с самого начала? Если передаваемый элемент не является строкой, то перед передачей вызовите ToString или сохраните результат ToString() в переменной в методе, как показано ниже.

Вот обновленная версия вашего метода:

public static string _FormatPhone(object phonevalue)
{
    string returnPhone = "Format Err#";

    Int64 phoneDigits;
    string phoneNumber = phonevalue.ToString();

    if (Int64.TryParse(phoneNumber, out phoneDigits))
    {
        if (phoneNumber.Length == 10)
        {
            return phoneDigits.ToString("(###) ###-####");
        }
        else if (phoneNumber.Length > 10)
        {
            // determine the length of placeholders needed for the format
            string format = "(###) ###-#### x"
                                + new string('#', phoneNumber.Length - 10);
            return phoneDigits.ToString(format);
        }
        else
        {
            return phoneNumber;
        }
    }

    return returnPhone;
}

Чтобы проверить это:

string[] inputs = { "456", "4445552222", "444555222288", "44455522226789" };
foreach (string input in inputs)
{
    Console.WriteLine("Format Result: " + _FormatPhone(input));
}

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

string[] inputs = { "456", "4445552222", "444555222288", "44455522226789" };
string pattern = @"(\d{3})(\d{3})(\d{4})(\d*)";
foreach (string input in inputs)
{
    string result = Regex.Replace(input, pattern, m =>
    {
        if (m.Value.Length >= 10)
        {
            return String.Format("({0}) {1}-{2}",
                m.Groups[1].Value, m.Groups[2].Value, m.Groups[3].Value)
                    + (m.Value.Length > 10 ? " x" + m.Groups[4].Value : "");
        }
        return m.Value;
    });
    Console.WriteLine("Regex result: " + result);
}
0 голосов
/ 08 марта 2010

с использованием регулярного выражения:

Regex usPhoneRegex = new Regex(@"(\d{3})(\d{3})(\d{4})(.*)", RegexOptions.IgnoreCase | RegexOptions.Compiled);
string USPhoneFormatString = "$1-$2-$3 x$4";
return usPhoneRegex.Replace("312588230012999", USPhoneFormatString));

Все, что после основного номера телефона будет возвращено как добавочный номер

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

- Правка - Ахмад указал, что я не рассматриваю случай числа без расширения.Итак, вот пересмотренная версия, которая использует MatchEvaluator для выполнения этой работы.Это лучше, чем другие ответы?Я не знаю - но это другой подход, поэтому я подумал, что я бы его выбросил.

Regex usPhoneRegex = new Regex(@"(\d{3})(\d{3})(\d{4})(.*)", RegexOptions.IgnoreCase | RegexOptions.Compiled);
return usPhoneRegex.Replace("3125882300", new MatchEvaluator(MyClass.formatPhone))

public static string formatPhone(Match m) {
  int groupIndex = 0;
  string results = string.Empty;
  foreach (Group g in m.Groups) {
    groupIndex +=1;
    switch (groupIndex) {
      case 2 : 
        results = g.Value;
        break;
      case 3 : 
      case 4 : 
        results += "-" + g.Value;
        break;
      case 5 :
        if (g.Value.Length != 0) {
          results += " x " + g.Value;
        }
        break;
    }
  }
  return results;
}

Вероятно, следует использовать StringBuilder.

0 голосов
/ 08 марта 2010

Попробуйте использовать регулярные выражения:

class Program
    {
        static void Main(string[] args)
        {
            var g = FormatUSPhone("444555222234");

        }

        public static string FormatUSPhone(string num)
        {
            string results = string.Empty;

            if(num.Length == 10)
            {
                num = num.Replace("(", "").Replace(")", "").Replace("-", "");
                const string formatPattern = @"(\d{3})(\d{3})(\d{4})";

                results = Regex.Replace(num, formatPattern, "($1) $2-$3");

            }else if (num.Length == 12)
            {
                num = num.Replace("(", "").Replace(")", "").Replace("-", "");
                const string formatPattern = @"(\d{3})(\d{3})(\d{4})(\d{2})";

                results = Regex.Replace(num, formatPattern, "($1) $2-$3 x$4");
            }

            return results;
        }

Я отредактировал вышеприведенное из примера, который нашел здесь . Поиграйте с приведенным выше кодом, посмотрите, поможет ли он вам.

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