web-dev-qa-db-fra.com

Comment diviser le numéro de mobile en code pays, indicatif régional et numéro local?

Comment diviser le numéro de mobile en code pays, indicatif régional et numéro local? par exemple +919567123456 après la séparation

code pays = 91

indicatif régional = 9567

numéro local = 123456

20
Vivart

Il n'est pas possible d'analyser les numéros de téléphone avec un algorithme simple, vous devez utiliser des tableaux de données remplis avec les règles de chaque pays - car chaque pays délimite ses numéros de téléphone différemment.

Le code de pays est assez simple, utilisez simplement les données de l'article Codes d'appel de pays dans wikipedia et créez un tableau de tous les codes de pays uniques. Chaque pays a un préfixe unique, donc c'est facile.

Mais ensuite, vous devez rechercher les règles de chaque pays que vous souhaitez prendre en charge et extraire le (s) indicatif (s) régional (s) en utilisant les règles de chaque pays.

23
Dean Harding

Ne maintenez pas votre propre tableau de toutes ces données! Utilisez la "bibliothèque Java International Phone Number Utilities v3.0", https://github.com/googlei18n/libphonenumber . C'est ce que Google utilise, et Google le maintient pour vous!

49
Kevin Bourrillion

Comme mentionné par diverses personnes, vous ne pouvez pas faire cela avec une simple correspondance de chaîne. Les longueurs des indicatifs de pays ou de zone ne sont pas fixes.

Ayant fait cela dans le passé, nous avons maintenu un tableau de structure similaire à celui-ci: -

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

Nous avons ensuite calculé la longueur maximale de area_code et country_code et vérifié la chaîne par sous-chaîne en commençant à la longueur maximale et en descendant jusqu'à ce que nous trouvions une correspondance.

Donc, étant donné le numéro 441634666788

Nous aurions commencé à la sous-chaîne [1,7] (7 étant la longueur de la plus longue combinaison de pays/indicatif régional), pas trouvé de correspondance, puis passé à [1,6] et trouvé la correspondance pour UK/Medway.

Pas très efficace mais cela a fonctionné.

MODIFIER

Vous pouvez également essayer quelque chose comme celui-ci, mais vous devrez le tester avec un ensemble de données complet ou peut-être même le décomposer en sélections distinctes de pays et d'indicatif régional, car il peut ne pas être très performant avec votre base de données choisie.

 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

Vous maintiendrez les champs match_string et match_length via un déclencheur, en prenant soin de gérer les codes de zone nuls et d'indexer la table sur la colonne match_string.

4
Steve Weet

Je pense que vous aurez besoin de quelque chose comme un dictionnaire d'indicatifs de pays et de régions. car leur stand peut avoir une longueur différente. USA +1, Allemagne +49, voire +6723. Idem avec les indicatifs régionaux.

3
chriszero

La réponse dépend beaucoup du pays. Il n'y a pas de règle universelle disant "c'est l'indicatif du pays, c'est l'indicatif régional, c'est le numéro local". La seule information qui peut être obtenue universellement est le numéro du pays (et même qui peut contenir de 1 à 4 chiffres); alors vous devez consulter l'ensemble de règles du pays spécifique.

Pour exemples (comme, "il y a beaucoup de numéros de téléphone différents dans les pays donnés, mais ils suivent tous le même format = "):

  • +420123456789 est un (faux) numéro en République tchèque (indicatif de pays +420), et le reste IS le numéro local (certains pays utilisent un espace d'adressage non divisé, bien que vous puissiez en déduire quelques bits) des données des 1 à 4 premiers chiffres du numéro local (par exemple, "+420800 sont des numéros sans frais")). Ainsi, le seul moyen utile d'analyser ce numéro est en deux parties, +420 123456789 .
  • +18005551234 est un numéro (probablement aussi faux) aux États-Unis; selon le plan de numérotation nord-américain , +1 est l'indicatif du pays, 800 est l'indicatif régional (numéros sans frais), 555 est le code d'échange et 1234 est le numéro local. Vous pouvez ensuite analyser le nombre en quatre parties, + 1 800 555 1234 .
3
Piskvor

Si vous vous efforcez de des données précises UK voir aussi http://code.google.com/p/ofcom-csverter/ pour une liste complète des indicatifs régionaux du Royaume-Uni avec des corrections.

1
g1smd

Un problème très complexe. Vous devez d'abord déterminer le code du pays . Selon le code du pays, le reste doit être divisé en code régional et numéro local. Mais aucune des trois parties n'a une longueur fixe, ni le numéro de trou ni l'indicatif régional et la combinaison de pièces locales!

Exemple: 4930123456789

  • 49 est l'indicatif pays de l'Allemagne
  • 30 est l'indicatif régional de Berlin
  • 123456789 est un numéro local à Berlin (pas de vrai)

Exemple: 493328123456

  • 49 est l'indicatif pays de l'Allemagne
  • 3328 est l'indicatif régional de Teltow
  • 123456 est un numéro local à Teltow (pas de vrai)

Exemple: 34971123456

  • 34 est l'indicatif pays de l'Espagne
  • 971 est l'indicatif régional de Majorque
  • 123456 est un numéro local à Majorque (pas de vrai)
0
Arne Burmeister