Oto rozwiązanie pozwalające uzyskać kraj na podstawie międzynarodowego numeru telefonu bez korzystania z biblioteki Google.
Pozwólcie, że najpierw wyjaśnię, dlaczego tak trudno jest ustalić kraj. Kod kilku krajów składa się z 1 cyfry, 2, 3 lub 4 cyfr. To byłoby dość proste. Ale kod kraju 1 jest używany nie tylko dla Stanów Zjednoczonych, ale także dla Kanady i niektórych mniejszych miejsc:
1339 USA
1340 Wyspy Dziewicze (Wyspy Karaibskie)
1341 USA
1342 nieużywane
1343 Kanada
Cyfry od 2 do 4 decydują, czy są to Stany Zjednoczone czy Kanada, czy ... Nie ma łatwego sposobu na określenie kraju, tak jak pierwsze xxx to Kanada, a reszta to Stany Zjednoczone.
Dla mojego kodu zdefiniowałem klasę, która przechowuje informacje na zawsze:
public class DigitInfo {
public char Digit;
public Country? Country;
public DigitInfo?[]? Digits;
}
Pierwsza tablica zawiera DigitInfos jako pierwszą cyfrę w liczbie. Druga cyfra jest używana jako indeks w DigitInfo.Digits. Jedna podróżuje w dół łańcucha cyfr, aż cyfry są puste. Jeśli zdefiniowano Country (tj. Nie jest to null), wartość zostanie zwrócona, w przeciwnym razie każdy kraj zdefiniowany wcześniej zostanie zwrócony:
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
Oto metoda, która zwraca kraj na podstawie numeru telefonu:
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;
}
Reszta kodu (digitInfos dla każdego kraju na świecie, kod testowy, ...) jest zbyt duża, aby umieścić ją tutaj, ale można ją znaleźć na Github:
https://github.com/PeterHuberSg/WpfWindowsLib/blob /master/WpfWindowsLib/CountryCode.cs
Kod jest częścią WPF TextBox, a biblioteka zawiera również inne kontrolki dla adresów e-mail itp. Bardziej szczegółowy opis znajduje się w CodeProject: Szczegółowy opis weryfikacji międzynarodowego numeru telefonu