Aquí hay una solución para obtener el país en función de un número de teléfono internacional sin usar la biblioteca de Google.
Permítanme explicar primero por qué es tan difícil entender el país. El código de país de algunos países es de 1 dígito, 2, 3 o 4 dígitos. Eso sería bastante simple. Pero el código de país 1 no solo se usa para EE. UU., Sino también para Canadá y algunos lugares más pequeños:
1339 EE. UU.
1340 Islas Vírgenes (Islas del Caribe)
1341 EE. UU.
1342 no utilizado
1343 Canadá
Los dígitos 2..4 deciden si es EE. UU. O Canadá o ... No hay una manera fácil de averiguar el país, ya que los primeros xxx son Canadá y el resto EE. UU.
Para mi código, definí una clase que contiene información para cada dígito:
public class DigitInfo {
public char Digit;
public Country? Country;
public DigitInfo?[]? Digits;
}
Una primera matriz contiene DigitInfos para el primer dígito del número. El segundo dígito se utiliza como índice en DigitInfo.Digits. Uno viaja por esa cadena de dígitos, hasta que los dígitos están vacíos. Si se define el país (es decir, no es nulo), se devuelve ese valor; de lo contrario, se devuelve cualquier país definido anteriormente:
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
Este es el método que devuelve el país según el número de teléfono:
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;
}
El resto del código (digitInfos para todos los países del mundo, código de prueba, ...) es demasiado grande para publicarlo aquí, pero se puede encontrar en Github:
https://github.com/PeterHuberSg/WpfWindowsLib/blob /master/WpfWindowsLib/CountryCode.cs
El código es parte de un WPF TextBox y la biblioteca también contiene otros controles para direcciones de correo electrónico, etc. Una descripción más detallada está en CodeProject: Validación de número de teléfono internacional explicada en detalle