这是一种无需使用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
这是根据电话号码返回国家/地区的方法:
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:国际电话号码验证详细解释