这是一种无需使用 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 的索引。一个人沿着 Digits 链向下移动,直到 Digits 为空。如果 Country 已定义(即不为 null),则返回该值,否则将返回之前定义的任何 Country:
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;
}
其余代码(世界各国的数字信息,测试代码,...)太大,无法在此处发布,但可以在 Github 上找到:
https ://github.com/PeterHuberSg/WpfWindowsLib/blob /master/WpfWindowsLib/CountryCode.cs
该代码是 WPF 文本框的一部分,该库还包含用于电子邮件地址等的其他控件。更详细的描述在 CodeProject:国际电话号码验证详细解释