다음은 Google 라이브러리를 사용하지 않고 국제 전화 번호로 국가를 가져 오는 솔루션입니다.
먼저 나라를 파악하는 것이 왜 그렇게 어려운지 설명하겠습니다. 소수 국가의 국가 코드는 1 자리, 2, 3 또는 4 자리입니다. 그것은 충분히 간단합니다. 그러나 국가 코드 1은 미국뿐만 아니라 캐나다 및 일부 소규모 지역에도 사용됩니다.
1339 USA
1340 Virgin Islands (Caribbean Islands)
1341 USA
1342 not used
1343 Canada
숫자 2..4는 그것이 미국인지 캐나다인지를 결정합니다. 첫 번째 xxx는 캐나다이고 나머지는 미국인 것처럼 국가를 알아내는 쉬운 방법은 없습니다.
내 코드의 경우 숫자에 대한 정보를 보유하는 클래스를 정의했습니다.
public class DigitInfo {
public char Digit;
public Country? Country;
public DigitInfo?[]? Digits;
}
첫 번째 배열은 숫자의 첫 번째 숫자에 대한 DigitInfo를 보유합니다. 두 번째 숫자는 DigitInfo.Digits에 대한 인덱스로 사용됩니다. 하나는 Digits가 비어있을 때까지 해당 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 TextBox의 일부이며 라이브러리에는 이메일 주소 등에 대한 다른 컨트롤도 포함되어 있습니다. 자세한 설명은 CodeProject에 있습니다. 국제 전화 번호 유효성 검사는 자세히 설명합니다.