Вот решение, чтобы получить страну по международному номеру телефона без использования библиотеки Google.
Позвольте мне сначала объяснить, почему так сложно определить страну. Код страны для некоторых стран состоит из 1, 2, 3 или 4 цифр. Это было бы достаточно просто. Но код страны 1 используется не только для США, но и для Канады и некоторых небольших городов:
1339 США
1340 Виргинские острова (Карибские острова)
1341 США
1342 не используется
1343 Канада
Цифры 2..4 определяют, США это или Канада или ... Нет простого способа определить страну, например, первые xxx - это Канада, а остальные - США.
Для своего кода я определил класс, который содержит информацию для всех цифр:
public class DigitInfo {
public char Digit;
public Country? Country;
public DigitInfo?[]? Digits;
}
Первый массив содержит DigitInfos для первой цифры номера. Вторая цифра используется как индекс в DigitInfo.Digits. Идут вниз по этой цепочке цифр, пока цифры не станут пустыми. Если Country определена (т.е. не null), это значение возвращается, в противном случае возвращается любая страна, определенная ранее:
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, а библиотека также содержит другие элементы управления для адресов электронной почты и т. Д. Более подробное описание находится в CodeProject: International Phone Number Validation Explained in Detail