Вот решение, чтобы получить страну на основе международного номера телефона без использования библиотеки 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
Вот метод, который возвращает страну на основе номера телефона:
/// <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;
}
Остальная часть кода (digitInfos для каждой страны мира, тестовый код и т. Д.) Слишком велика, чтобы размещать ее здесь, но ее можно найти на Github: https://github.com/PeterHuberSg/WpfWindowsLib/blob/master/WpfWindowsLib/CountryCode.cs
Код является частью текстового поля WPF, а библиотека содержит также другие элементы управления для адресов электронной почты и т. Д. Более подробное описание находится на CodeProject: Подробнее о проверке международного номера телефона
person
Peter Huber
schedule
11.04.2020