Формат строки как номер телефона в Великобритании - PullRequest
5 голосов
/ 23 января 2009

Я ищу процедуру, которая отформатирует строку чисел как номер телефона в Великобритании. Процедура должна учитывать коды городов Великобритании, которые требуют различного форматирования (т. Е. Лондон по сравнению с Эдинбургом по сравнению с Вустером), а также номера мобильных телефонов.

Мои номера телефонов хранятся в базе данных в виде строк, содержащих только числовые символы.

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

/// <summary>
/// Formats a string as a UK phone number
/// </summary>
/// <remarks>
/// 02012345678 becomes 020 1234 5678
/// 01311234567 becomes 0131 123 4567
/// 01905123456 becomes 01905 123456
/// 07816123456 becomes 07816 123456
/// </remarks>
public static string FormatPhoneNumber(string phoneNumber)
{
    string formattedPhoneNumber = null;

    if (!string.IsNullOrEmpty(phoneNumber))
    {
        System.Text.RegularExpressions.Regex area1 = new System.Text.RegularExpressions.Regex(@"^0[1-9]0");
        System.Text.RegularExpressions.Regex area2 = new System.Text.RegularExpressions.Regex(@"^01[1-9]1");

        string formatString;

        if (area1.Match(phoneNumber).Success)
        {
            formatString = "0{0:00 0000 0000}";
        }
        else if (area2.Match(phoneNumber).Success)
        {
            formatString = "0{0:000 000 0000}";
        }
        else
        {
            formatString = "0{0:0000 000000}";
        }

        formattedPhoneNumber = string.Format(formatString, Int64.Parse(phoneNumber));
    }

    return formattedPhoneNumber;
}

Приветствуются мысли о том, как улучшить это ...

Редактировать

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

Редактировать 2

Все телефонные номера будут географическими номерами Великобритании или мобильными номерами в Великобритании, поэтому особые случаи, такие как 0800, рассматривать не нужно

Ответы [ 4 ]

12 голосов
/ 23 января 2009

Телефонные номера в Великобритании имеют длину от 7 до 10 цифр, не включая начальный ноль. коды "области" могут варьироваться от 2 до 4 (но иногда 5) цифр.

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

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

2 голосов
/ 27 октября 2016

Я потратил некоторое время на просмотр листов OFCOM и придумал следующее.

public static class TelephoneHelper
{

    #region Regex Patterns
    private static readonly Regex[] patterns = 
    {
        new Regex(@"(?<first>013873)(?<second>\d{5})"),
        new Regex(@"(?<first>015242)(?<second>\d{5})"),
        new Regex(@"(?<first>015394)(?<second>\d{5})"),
        new Regex(@"(?<first>015395)(?<second>\d{5})"),
        new Regex(@"(?<first>015396)(?<second>\d{5})"),
        new Regex(@"(?<first>016973)(?<second>\d{5})"),
        new Regex(@"(?<first>016974)(?<second>\d{5})"),
        new Regex(@"(?<first>016977)(?<second>\d{4}\d?)"),
        new Regex(@"(?<first>017683)(?<second>\d{5})"),
        new Regex(@"(?<first>017684)(?<second>\d{5})"),
        new Regex(@"(?<first>017687)(?<second>\d{5})"),
        new Regex(@"(?<first>019467)(?<second>\d{5})"),
        new Regex(@"(?<first>02\d)(?<second>\d{4})(?<third>\d{4})"),
        new Regex(@"(?<first>03\d{2})(?<second>\d{3})(?<third>\d{4})"),
        new Regex(@"(?<first>0500\d{6})"),
        new Regex(@"(?<first>05\d{3})(?<second>\d{6})"),
        new Regex(@"(?<first>07\d{3})(?<second>\d{6})"),
        new Regex(@"(?<first>08\d{2})(?<second>\d{3})(?<third>\d{3}\d?)"),
        new Regex(@"(?<first>09\d{2})(?<second>\d{3})(?<third>\d{4})"),
        new Regex(@"(?<first>01\d1)(?<second>\d{3})(?<third>\d{4})"),
        new Regex(@"(?<first>011\d)(?<second>\d{3})(?<third>\d{4})"),
        new Regex(@"(?<first>01\d{3})(?<second>\d{5}\d?)")
    };
    #endregion

    public static string FormatAsUkTelephone(this string number)
    {
        Regex matchedPattern = null;
        foreach (Regex pattern in patterns)
        {
            if (pattern.IsMatch(number))
            {
                matchedPattern = pattern;
                break;
            }
        }
        if (matchedPattern != null)
        {
            var mc = matchedPattern.Matches(number);
            if (mc[0].Groups.Count == 3)
            {
                return String.Format("{0} {1}", mc[0].Groups["first"], mc[0].Groups["second"]);
            }
            else if (mc[0].Groups.Count == 4)
            {
                return String.Format("{0} {1} {2}", mc[0].Groups["first"], mc[0].Groups["second"], mc[0].Groups["third"]);
            }
        }
        return number;
    }
2 голосов
/ 08 ноября 2009

** Я ищу процедуру, которая будет форматировать строку чисел как номер телефона в Великобритании. **

Вы можете загрузить базу данных Ofcom, в которой перечислены форматы для каждого диапазона номеров, включая номера только для национальных номеров, и выполнить поиск каждого номера, который необходимо отформатировать. В базе данных перечислены цифры SABCDE и формат: 0 + 10, 2 + 8, 3 + 7, 4 + 6, 4 + 5, 5 + 5 или 5 + 4 для каждого диапазона.

В базе данных имеется небольшое количество ошибок (особенно для кодов 01697 и 0169 77), но они содержат менее десяти ошибок в более чем четверти миллиона записей.

Существует четыре файла с номерами 01 и 02 и отдельные файлы для различных диапазонов негеографических номеров.

0 + 10 номеров - «Только национальный набор» и пишутся без скобок вокруг части кода города. Код города будет 02x для всех 02 номеров, 01xx для всех номеров 011x и 01x1 и 01xxx для большинства других номеров 01 (хотя очень маленькое число - около дюжины - будет 01xx xx).

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

Номенклатура 2 + 8 показывает код города и длину местного номера, с вводом 2075: 2 + 8 означает, что номер отформатирован как (020) 75xx xxxx. Помните, что ведущий ноль не «учитывается» при определении 2 + 8.

** Длина телефонных номеров в Великобритании варьируется от 8 до 12 цифр **

Нет. С 2000 года большинство имеют 10 цифр после кода транка «0». У некоторых все еще есть 9 цифр после кода магистрали '0'.

Есть также несколько специальных чисел, таких как 0800 1111 и 0845 4647.

** Коды "области" могут варьироваться от 2 до 4 цифр. **

Коды регионов могут варьироваться от 2 до 5 цифр (начальный ноль не учитывается). Для ясности, «020» классифицируется как двузначный код города, потому что в начале 0 - это код транка. Существуют также коды городов 011x и 01x1, и большинство номеров имеют коды городов 01xxx. Последние могут иметь локальные номера длиной всего 5 цифр вместо более распространенных 6-значных локальных номеров. Очень маленькое число имеет код города 01xx xx, и у них есть 5 или 4 цифры местных номеров.

** Кроме того, не существует стандарта для точного расположения пробелов. **

Между частью кода города и частью местного номера всегда есть пробел для всех номеров 01 и 02.

Традиционно для (01xx xx) кодов городов в коде области должен быть пробел, как показано. Это представляет старые локальные группы обмена, где эта система все еще используется. Другие (более короткие) коды городов не разделяются.

Локальные номера с 7 или 8 цифрами разделяются перед четвертой цифрой с конца. Местные номера с 4, 5 или 6 цифрами не разделяются. Это относится как к географическим, так и к негеографическим номерам.

Для большинства номеров 03, 08 и 09 число записывается как 0xxx xxx xxxx.

Некоторые цифры 0800 и все 0500 записаны 0xxx xxxxxx.

Для номеров 055, 056 и 070 записывается число 0xx xxxx xxxx.

Для номеров мобильных телефонов и пейджеров используйте 07xxx xxxxxx.

** за исключением того, что некоторые люди используют '08000 abc def' вместо '0800 0abc def' **

Это использование неверно. Имейте в виду, что некоторые номера 0800 имеют 9 цифр после кода транка 0, тогда как другие имеют 10 цифр после кода транка 0.

Итак, оба 0800 хххххх и 0800 ххх хххх верны.

0500 номеров используют только 0500 xxxxxx.

Большинство чисел 03, 08 и 09 написаны в виде 0xxx xxx xxxx.

Смотрите также: http://en.wikipedia.org/wiki/Local_conventions_for_writing_telephone_numbers#United_Kingdom

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

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

if( phoneNumber.substring(1,1) == "2" )
{
    // 000 0000 0000
}
else if( phoneNumber.substring(1,1) == "1" && (phoneNumber.substring(1,1) == "2" || phoneNumber.substring(3,1) = "1") )
{
    // 0000 000 0000
}
else
{
    // 00000 000000
}

NB. Ваши шаблоны немного ошибочны 023 - это трехзначный код, а 0800 - не

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