Hier ist eine Lösung, um das Land anhand einer internationalen Telefonnummer zu ermitteln, ohne die Google-Bibliothek zu verwenden.
Lassen Sie mich zunächst erklären, warum es so schwierig ist, das Land herauszufinden. Der Ländercode einiger Länder ist 1-stellig, 2, 3 oder 4-stellig. Das wäre einfach genug. Der Ländercode 1 wird jedoch nicht nur für die USA verwendet, sondern auch für Kanada und einige kleinere Orte:
1339 USA
1340 Jungferninseln (Karibikinseln)
1341 USA
1342 nicht verwendet
1343 Kanada
Die Ziffern 2..4 entscheiden, ob es sich um die USA oder Kanada handelt oder ... Es gibt keine einfache Möglichkeit, das Land herauszufinden, da die ersten xxx Kanada und die übrigen USA sind.
Für meinen Code habe ich eine Klasse definiert, die Informationen für jede Ziffer enthält:
public class DigitInfo {
public char Digit;
public Country? Country;
public DigitInfo?[]? Digits;
}
Ein erstes Array enthält die DigitInfos für die erste Ziffer in der Nummer. Die zweite Ziffer wird als Index für DigitInfo.Digits verwendet. Man fährt die Ziffernkette entlang, bis die Ziffern leer sind. Wenn Land definiert ist (dh nicht null), wird dieser Wert zurückgegeben, andernfalls wird jedes zuvor definierte Land zurückgegeben:
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
Hier ist die Methode, mit der das Land basierend auf der Telefonnummer zurückgegeben wird:
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;
}
Der Rest des Codes (digitInfos für jedes Land der Welt, Testcode, ...) ist zu groß, um hier veröffentlicht zu werden. Er ist jedoch auf Github zu finden:
https://github.com/PeterHuberSg/WpfWindowsLib/blob /master/WpfWindowsLib/CountryCode.cs
Der Code ist Teil einer WPF-Textbox und die Bibliothek enthält auch andere Steuerelemente für E-Mail-Adressen usw. Eine detailliertere Beschreibung finden Sie in CodeProject: Internationale Telefonnummernvalidierung im Detail erklärt