Преобразование нормализованного номера телефона к удобной для пользователя версии

Вот способ использования sub2ind . Я не рассчитывал это:

sz = [100 100 100 200];
M = zeros(sz(1)*sz(2)*sz(3), sz(4));
ind = sub2ind(sz([1 2 3]), coordinates(:,1), coordinates(:,2), coordinates(:,3));
M(ind(:),:) = timeseries;
M = reshape(M, sz);

Вы можете немного увеличить скорость, заменив sub2ind на ручной расчет:

sz = [100 100 100 200];
M = zeros(sz(1)*sz(2)*sz(3), sz(4));
ind = coordinates(:,1) + sz(1)*(coordinates(:,2)-1) + sz(1)*sz(2)*(coordinates(:,3)-1);
M(ind(:),:) = timeseries;
M = reshape(M, sz);

6
задан Bramha Ghosh 8 January 2009 в 21:15
поделиться

6 ответов

String.Format("{0:(###) ###-#### x ###}", double.Parse("1234567890123"))

Приведет к (123) 456-7890 x 123

9
ответ дан 8 December 2019 в 14:48
поделиться

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

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

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

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

2
ответ дан 8 December 2019 в 14:48
поделиться

Используя regex можно заменить:

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

с:

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

(Хотя я не знаком с американскими номерами телефона поэтому, возможно, существует больше к нему.)

4
ответ дан 8 December 2019 в 14:48
поделиться

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

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

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

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

так: (123) 456-7890 x1234 был бы сохранен как +1 (123) 456-7890 x1234

(Perl-совместимый) regex был бы чем-то как (полностью непротестированный, и не будет работать):

(+ \d +)?\s + (((\d {3})) (? \s + ([-.0-9] {6}) \s + ((x|ext\w*)\d {4})

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

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

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

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

1
ответ дан 8 December 2019 в 14:48
поделиться

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

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

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

0
ответ дан 8 December 2019 в 14:48
поделиться

Вот дополнительный метод, который мог бы помочь:

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
ответ дан 8 December 2019 в 14:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: