Преобразование нормализованного номера телефона в удобную версию - PullRequest
6 голосов
/ 08 января 2009

В моем приложении C # я использую регулярное выражение для проверки основного формата номера телефона в США, чтобы убедиться, что пользователь не просто вводит фиктивные данные. Затем я вычеркиваю все, кроме чисел, вот так:

(123) 456-7890 x1234

становится

12345678901234

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

(123) 456-7890 x1234

Какой лучший способ сделать такую ​​вещь? (Кстати, не беспокойтесь об учете международных форматов телефонных номеров.)

Ответы [ 6 ]

9 голосов
/ 08 января 2009
String.Format("{0:(###) ###-#### x ###}", double.Parse("1234567890123"))

Результатом будет (123) 456-7890 x 123

4 голосов
/ 08 января 2009

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

(\d{3})(\d{3})(\d{4})(\d{4})

с:

(\1) \2-\3 x\4

(Хотя я не знаком с телефонными номерами в США, так что, может быть, это еще не все.)

2 голосов
/ 08 января 2009

Я бы просто использовал строку произвольного формата для преобразования числа обратно в строку:

class Program
{
    static void Main(string[] args)
    {
        long phoneNumber = 12345678901234;
        string phoneNumberString = String.Format("{0:(000) 000-0000 x0000}", phoneNumber);
        Console.WriteLine(phoneNumberString);
    }
}

Конечно, вы должны выделить его в функцию, которая будет принимать телефонный номер как длинную, а затем возвращать строку (с форматом, загруженным или сохраненным в качестве константы в методе, или чем-то соответствующим вашей ситуации).

О, и если у вас есть строка и не длинная строка, вы можете легко преобразовать строку в длинную и затем передать ее в функцию форматирования. Конечно, здесь есть соображения производительности, если вы делаете это многократно (поскольку вы перебираете строку для создания long, а затем конвертируете ее обратно в строку, когда вы можете просто использовать подстроку).

1 голос
/ 09 января 2009

Если вы поддерживаете только американские номера, вы можете просто отформатировать цифры, чтобы показать скобки и х, где вы хотите.

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

Чтобы заставить его принять любую страну, я бы сделал это:

Я бы добавил код IDD ко всем телефонным номерам, а затем скрыл бы его от пользователей из этой страны.

так: (123) 456-7890 x1234 будет храниться как +1 (123) 456-7890 x1234

(Perl-совместимое) регулярное выражение будет что-то вроде (полностью не проверено и не будет работать):

?

(+ \ D +) \ S + (((\ г {, 3})) (\ S + ([-. 0-9] {6}) \ S + ((х | внутр \ ш *) \ д {,} 4)

  • Это необязательное количество цифр, которым предшествует +
  • После одного или нескольких пробелов
  • Затем необязательная группа до 3 цифр в скобках
  • Тогда один или несколько пробелов
  • Затем группа из 6 или более цифр, тире или точек
  • Тогда один или несколько пробелов
  • Затем необязательный x или слово, начинающееся с ext (ext, extension ...) и группа до 4 цифр

У меня была бы база данных пользователей, включая код страны и города, а затем автоматически их заполнять, если они отсутствуют, для страны будет применяться соглашение о группировке цифр по умолчанию для телефонных номеров (3,4 для нас).

  • Таким образом, если вы находитесь в области 123 в США и введите 456.7890, он будет проанализирован как +1 (123) 4567890, и вы увидите его только как 456-7890
  • если вы находитесь в Катаре и вводите номер 4444555 extenshn 33, он сохраняется как +974 4444555 x33, вы увидите его как 4444555 x33

Международный код не будет отображаться для пользователей в одной и той же стране, а код города не будет отображаться для пользователей в той же стране и коде города. Полный номер будет отображаться на mooover (метка HTML?)

0 голосов
/ 26 марта 2009

Вот метод расширения, который может помочь:

public static string InsertStringAtPositions(this string str, string insertStr, IEnumerable<int> positions)
{
    if (str != null && insertStr != null && positions != null)
    {
        string newString = string.Empty;
        int previousPos = 0;
        foreach (var pos in positions)
        {
            if (pos < str.Length)
            {
                newString += str.Substring(previousPos, pos - previousPos) + insertStr;
                previousPos = pos;
            }
        }
        if (positions.Last() < str.Length)
        {
            return newString + str.Substring(positions.Last(), str.Length - positions.Last());
        }
        return newString;
    }
    return str;
}

Использование:

// Will convert "0399998888" to "03 9999 8888"
number.InsertStringAtPositions(" ", new[] {2, 6});
0 голосов
/ 08 января 2009

Вы должны разбить его на БД? Если нет, не надо. Если вы ДОЛЖНЫ, тогда вы можете хранить разные детали в разных полях (Areacode, Prefix, SubscriberNum, Extenion).

Или извлеките число и начните анализ. Если это только 10 цифр, то вы знаете, что нет расширения. Все цифры после 10, вставьте их в строку после «х» или чего-то еще.

Я сделал нечто похожее на это в приложении C ++. Я записал хранимые разные механизмы контактов в виде одной строки, но вместо этого я сделал все наоборот. Я взял поля из диалогового окна и создал отформатированное число для хранения в виде строки.

...