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