Подтвердить что ты не робот

Как разбить мобильный номер на код страны, код города и локальный номер?

Как разбить номер мобильного телефона на код страны, код города и локальный номер? например, +919567123456 после разделения

код страны = 91

код зоны = 9567

местное число = 123456

4b9b3361

Ответ 1

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

Код страны довольно прост, просто используйте данные из Country calls codes в википедии и создайте таблицу всех уникальных коды стран. Каждая страна имеет уникальный префикс, поэтому легко.

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

Ответ 2

Не сохраняйте свою собственную таблицу всех этих данных! Используйте "Java International Phone Number Utilities library v3.0", https://github.com/googlei18n/libphonenumber. Это то, что Google использует, и Google поддерживает его для вас!

Ответ 3

Как упоминалось разными людьми, вы не можете сделать это с помощью простого сопоставления строк. Длины ни страны, ни кода зоны не установлены.

Сделав это в прошлом, мы сохранили таблицу, похожую по структуре, на следующую: -

+------------+---------+-------+--------------+
|country_code|area_code|country|area          |
+------------+---------+-------+--------------+
|44          |1634     |UK     |Medway        |
|44          |20       |UK     |London        |
|964         |23       |Iraq   |Wasit (Al Kut)|
|964         |2412     |Iraq   |Unreal        |
+------------+---------+-------+--------------+

Затем мы рассчитали максимальную длину area_code и country_code и проверили строку путем подстроки, начиная с максимальной длины и пробираясь вниз, пока не найдем совпадение.

Так что дано число 441634666788

Мы бы начали с подстроки [1,7] (7 - длина самой длинной комбинации кода страны/региона), не нашли соответствия, затем перешли к [1,6] и нашли соответствие для Великобритании/Медвей.

Не очень эффективный, но он сработал.

EDIT

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

 DECLARE @area_codes TABLE
(
    country_code VARCHAR(10),
    area_code VARCHAR(10),
    country VARCHAR(20),
    area VARCHAR(20),
    match_string VARCHAR(MAX),
    match_length INTEGER
)

INSERT INTO @area_codes VALUES ('44','1382','UK','Dundee', '441382%', 6)
INSERT INTO @area_codes VALUES ('44','1386','UK','Evesham', '441386%', 6)
INSERT INTO @area_codes VALUES ('44', '1', 'UK', 'Geographic numbers', '441%', 3)

DECLARE @number VARCHAR(MAX)
SET @number = '441386111111'

SELECT TOP 1 * 
FROM @area_codes 
WHERE @number LIKE match_string
ORDER BY match_length DESC

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

Ответ 4

Думаю, вам понадобится что-то вроде диктатора кода страны и региона. потому что стенд из них может иметь другую длину. США +1, Германия +49, даже +6723. То же самое с Areacodes..

Ответ 5

Ответ очень сильно зависит от страны. Нет универсального правила, говорящего "это код страны, это код области, это локальный номер". Единственной информацией, которую можно получить повсеместно, является номер страны (и даже это может быть 1-4 цифры в длину); то вам необходимо проконсультироваться с определенным набором правил для стран.

Для примеров (например, "в разных странах есть много разных телефонных номеров, но все они следуют одному и тому же формату" ):

  • +420123456789 является (фиктивным) номером в Чешской Республике (код страны +420), а остальное - местным номером (в некоторых странах используется неразделенное пространство адресации, хотя вы можете сделать вывод о нескольких битах данных с первого -4 цифры локального номера (например, "+420800 - бесплатные номера" )). Итак, единственный полезный способ разобрать это число состоит из двух частей: +420 123456789.
  • +18005551234 - (возможно, также фиктивный) номер в США; в соответствии с североамериканский нумерационный план, +1 - код страны, 800 - код города (бесплатные номера), 555 - код обмена и 1234 - локальный номер. Затем вы можете разобрать число на четыре части, +1 800 555 1234.

Ответ 6

Если вы будете стремиться к точным данным в Великобритании, см. также http://code.google.com/p/ofcom-csverter/ для полного списка кодов Великобритании с исправлениями.

Ответ 7

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

Пример: 4930123456789

  • 49 - код страны Германии
  • 30 - код города Берлин
  • 123456789 - это локальный номер в Берлине (без реальной).

Пример: 493328123456

  • 49 - код страны Германии
  • 3328 - телефонный код города Тельтов
  • 123456 - это локальный номер в Тельтове (без реального)

Пример: 34971123456

  • 34 - код страны Испании.
  • 971 - это код города Мальорка
  • 123456 - это локальный номер на Майорке (без реальной).