Ось рішення, як отримати країну на основі міжнародного телефонного номера без використання бібліотеки Google.
Дозвольте пояснити спочатку, чому так складно з’ясувати країну. Код країни кількох країн - 1 цифра, 2, 3 або 4 цифри. Це було б досить просто. Але код країни 1 використовується не лише для США, а й для Канади та деяких менших місць:
1339 США
1340 Віргінські острови (Карибські острови)
1341 США
1342 не використовується
1343 Канада
Цифри 2..4 вирішують, це США чи Канада чи ... Не існує простого способу з’ясувати країну, як перші ХХХ - це Канада, решта США.
Для мого коду я визначив клас, який містить інформацію для постійної цифри:
public class DigitInfo {
public char Digit;
public Country? Country;
public DigitInfo?[]? Digits;
}
Перший масив містить DigitInfos для першої цифри числа. Друга цифра використовується як індекс у DigitInfo.Digits. Кожен рухається вниз по цьому ланцюжку цифр, поки цифри не порожні. Якщо країна визначена (тобто не є нульовою), це значення повертається, інакше повертається будь-яка країна, визначена раніше:
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
Ось спосіб повернення країни на основі номера телефону:
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;
}
Решта коду (digitInfos для кожної країни світу, тестовий код, ...) завелика для розміщення тут, але його можна знайти на Github:
https://github.com/PeterHuberSg/WpfWindowsLib/blob /master/WpfWindowsLib/CountryCode.cs
Код є частиною WPF TextBox, а бібліотека містить також інші елементи керування адресами електронної пошти тощо. Більш детальний опис наведено на CodeProject: Міжнародна перевірка телефонних номерів.