Как разделить номер мобильного телефона на код страны, код города и местный номер? - PullRequest
18 голосов
/ 30 марта 2010

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

код страны = 91

код города = 9567

местный номер = 123456

Ответы [ 7 ]

49 голосов
/ 31 марта 2010

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

22 голосов
/ 30 марта 2010

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

Код страны довольно прост, просто используйте данные из статьи Коды стран в википедии и создайте таблицу всех уникальных кодов стран. У каждой страны есть уникальный префикс, так что это просто.

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

4 голосов
/ 30 марта 2010

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

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

+------------+---------+-------+--------------+
|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] и нашли бы соответствие для Великобритании /Medway.

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

РЕДАКТИРОВАТЬ

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

 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.

3 голосов
/ 30 марта 2010

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

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

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

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

1 голос
/ 06 января 2011

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

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

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

Пример: 4930123456789

  • 49 - код страны Германии
  • 30 - код города Берлина
  • 123456789 - местный номер в Берлине (не настоящий)

Пример: 493328123456

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

Пример: 34971123456

  • 34 - код страны Испании
  • 971 - код города Майорки
  • 123456 - это местный номер на Майорке (не настоящий)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...