Đây là một giải pháp để lấy quốc gia dựa trên số điện thoại quốc tế mà không cần sử dụng thư viện Google.
Đầu tiên hãy để tôi giải thích lý do tại sao rất khó để tìm ra đất nước. Mã quốc gia của một số quốc gia là 1 chữ số, 2, 3 hoặc 4 chữ số. Điều đó sẽ đủ đơn giản. Nhưng mã quốc gia 1 không chỉ được sử dụng cho Hoa Kỳ mà còn cho Canada và một số nơi nhỏ hơn:
1339 Hoa Kỳ
1340 Quần đảo Virgin (Quần đảo Caribe)
1341 Hoa Kỳ
1342 không được sử dụng
1343 Canada
Các chữ số 2..4 quyết định, nếu đó là Hoa Kỳ hay Canada hoặc ... Không có cách nào dễ dàng để tìm ra quốc gia, như xxx đầu tiên là Canada, phần còn lại là Hoa Kỳ.
Đối với mã của tôi, tôi đã xác định một lớp chứa thông tin cho từng chữ số:
public class DigitInfo {
public char Digit;
public Country? Country;
public DigitInfo?[]? Digits;
}
Mảng đầu tiên chứa DigitInfos cho chữ số đầu tiên trong số. Chữ số thứ hai được dùng làm chỉ mục cho DigitInfo.Digits. Một người đi xuống chuỗi Chữ số đó, cho đến khi Chữ số trống. Nếu Quốc gia được xác định (tức là không null) thì giá trị đó sẽ được trả về, nếu không thì bất kỳ Quốc gia nào được xác định trước đó sẽ được trả về:
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
Đây là phương pháp trả về quốc gia dựa trên số điện thoại:
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;
}
Phần còn lại của mã (digitInfos cho mọi quốc gia trên thế giới, mã kiểm tra, ...) quá lớn để đăng ở đây, nhưng bạn có thể tìm thấy nó trên Github:
https://github.com/PeterHuberSg/WpfWindowsLib/blob /master/WpfWindowsLib/CountryCode.cs
Mã là một phần của WPF TextBox và thư viện cũng chứa các điều khiển khác cho địa chỉ email, v.v. Mô tả chi tiết hơn có trên CodeProject: Giải thích xác thực số điện thoại quốc tế trong chi tiết