99 votes

Extraire l'indicatif du pays du numéro de téléphone [libphonenumber].

J'ai une chaîne comme celle-ci : +33123456789 (numéro de téléphone français). Je veux extraire le code pays (+33) sans connaître le pays. Par exemple, cela devrait fonctionner si j'ai un autre téléphone d'un autre pays. J'utilise la bibliothèque google https://code.google.com/p/libphonenumber/ .

Si je connais le pays, c'est cool que je puisse trouver le code du pays :

PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
int countryCode = phoneUtil.getCountryCodeForRegion(locale.getCountry());

mais je ne trouve pas de moyen d'analyser une chaîne sans connaître le pays.

150voto

aat Points 752

Ok, donc j'ai rejoint le groupe google de libphonenumber ( https://groups.google.com/forum/?hl=en&fromgroups#!forum/libphonenombre-discussion ) et j'ai posé une question.

Je n'ai pas besoin de définir le pays en paramètre si mon numéro de téléphone commence par "+". Voici un exemple :

PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
try {
    // phone must begin with '+'
    PhoneNumber numberProto = phoneUtil.parse(phone, "");
    int countryCode = numberProto.getCountryCode();
} catch (NumberParseException e) {
    System.err.println("NumberParseException was thrown: " + e.toString());
}

4voto

Ali Nawaz Points 472

J'ai gardé une méthode d'aide pratique pour s'occuper de cela, basée sur une réponse postée ci-dessus :

Importations :

import com.google.i18n.phonenumbers.NumberParseException
import com.google.i18n.phonenumbers.PhoneNumberUtil

Fonction :

    fun parseCountryCode( phoneNumberStr: String?): String {
        val phoneUtil = PhoneNumberUtil.getInstance()
        return try {
            // phone must begin with '+'
            val numberProto = phoneUtil.parse(phoneNumberStr, "")
            numberProto.countryCode.toString()
        } catch (e: NumberParseException) {
            ""
        }
    }

3voto

Ici, vous pouvez enregistrer le numéro de téléphone en tant que numéro de téléphone au format international.

internationalFormatPhoneNumber = phoneUtil.format(givenPhoneNumber, PhoneNumberFormat.INTERNATIONAL);

il renvoie le numéro de téléphone comme Format international +94 71 560 4888

donc maintenant j'ai obtenu le code pays comme ceci

String countryCode = internationalFormatPhoneNumber.substring(0,internationalFormatPhoneNumber.indexOf('')).replace('+', ' ').trim();

J'espère que cela vous aidera

1voto

Peter Huber Points 79

Voici une solution pour obtenir le pays à partir d'un numéro de téléphone international sans utiliser la bibliothèque de Google.

Laissez-moi d'abord vous expliquer pourquoi il est si difficile de déterminer le pays. Le code pays de quelques pays est à 1, 2, 3 ou 4 chiffres. Ce serait assez simple. Mais le code pays 1 n'est pas seulement utilisé pour les États-Unis, mais aussi pour le Canada et d'autres pays plus petits :

1339 USA
1340 Îles Vierges (îles des Caraïbes)
1341 USA
1342 non utilisé
1343 Canada

Les chiffres 2 à 4 déterminent s'il s'agit des États-Unis, du Canada ou ... Il n'y a pas de moyen facile de déterminer le pays, comme les premiers xxx sont le Canada, les autres les Etats-Unis.

Pour mon code, j'ai défini une classe qui contient des informations pour chaque chiffre :

public class DigitInfo {
  public char Digit;
  public Country? Country;
  public DigitInfo?[]? Digits;
}

Un premier tableau contient les DigitInfos pour le premier chiffre du nombre. Le deuxième chiffre est utilisé comme un index dans DigitInfo.Digits. On descend dans la chaîne Digits, jusqu'à ce que Digits soit vide. Si le pays est défini (c'est-à-dire s'il n'est pas nul), cette valeur est retournée, sinon tout pays défini précédemment est retourné :

country code 1: byPhone[1].Country is US  
country code 1236: byPhone[1].Digits[2].Digits[3].Digits[6].Country is Canada  
country code 1235: byPhone[1].Digits[2].Digits[3].Digits[5].Country is null. Since   
                   byPhone[1].Country is US, also 1235 is US, because no other   
                   country was found in the later digits

Voici la méthode qui renvoie le pays en fonction du numéro de téléphone :

/// <summary>
/// Returns the Country based on an international dialing code.
/// </summary>
public static Country? GetCountry(ReadOnlySpan<char> phoneNumber) {
  if (phoneNumber.Length==0) return null;

  var isFirstDigit = true;
  DigitInfo? digitInfo = null;
  Country? country = null;
  foreach (var digitChar in phoneNumber) {
    var digitIndex = digitChar - '0';
    if (isFirstDigit) {
      isFirstDigit = false;
      digitInfo = ByPhone[digitIndex];
    } else {
      if (digitInfo!.Digits is null) return country;

      digitInfo = digitInfo.Digits[digitIndex];
    }
    if (digitInfo is null) return country;

    country = digitInfo.Country??country;
  }
  return country;
}

Le reste du code (digitInfos pour chaque pays du monde, code de test, ...) est trop gros pour être affiché ici, mais il peut être trouvé sur Github : https://github.com/PeterHuberSg/WpfWindowsLib/blob/master/WpfWindowsLib/CountryCode.cs

Le code fait partie d'un TextBox WPF et la bibliothèque contient également d'autres contrôles pour les adresses e-mail, etc. Une description plus détaillée se trouve sur CodeProject : La validation des numéros de téléphone internationaux expliquée en détail

0voto

soni kumari Points 131

Utilisez un bloc try catch comme ci-dessous :

try { 

const phoneNumber = this.phoneUtil.parseAndKeepRawInput(value, this.countryCode);

}catch(e){}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X