これは、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;
}
最初の配列は、番号の最初の桁のDigitInfoを保持します。2桁目は、DigitInfo.Digitsへのインデックスとして使用されます。Digitsが空になるまで、そのDigitsチェーンを下に移動します。国が定義されている(つまり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
コードはWPFTextBoxの一部であり、ライブラリには電子メールアドレスなどの他のコントロールも含まれています。詳細については、CodeProject:International Phone Number Validation ExplainedinDetailを参照してください。