Tengo una cadena como esta: +33123456789 (número de teléfono francés). Quiero extraer el código de país (+33) sin conocer el país. Por ejemplo, debería funcionar si tengo otro teléfono de otro país. Utilizo la biblioteca de Google https://code.google.com/p/libphonenumber/ .
Si conozco el país, es genial que pueda encontrar el código del país:
PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
int countryCode = phoneUtil.getCountryCodeForRegion(locale.getCountry());
pero no encuentro la manera de analizar una cadena sin conocer el país.
android
libphonenumber
mrroboaat
fuente
fuente
Respuestas:
Bien, me uní al grupo de google de libphonenumber ( https://groups.google.com/forum/?hl=en&fromgroups#!forum/libphonenumber-discuss ) y le hice una pregunta.
No necesito configurar el país en el parámetro si mi número de teléfono comienza con "+". Aquí hay un ejemplo :
PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance(); try { // phone must begin with '+' PhoneNumber numberProto = phoneUtil.parse(phone, ""); int countryCode = numberProto.getCountryCode(); } catch (NumberParseException e) { System.err.println("NumberParseException was thrown: " + e.toString()); }
fuente
s
biblioteca PhoneNumberUtil incluida en AndroidAquí puede guardar el número de teléfono como número de teléfono con formato internacional
internationalFormatPhoneNumber = phoneUtil.format(givenPhoneNumber, PhoneNumberFormat.INTERNATIONAL);
devuelve el número de teléfono como formato internacional +94 71560 4888
así que ahora tengo el código de país como este
String countryCode = internationalFormatPhoneNumber.substring(0,internationalFormatPhoneNumber.indexOf('')).replace('+', ' ').trim();
Espero que esto te ayudará
fuente
internationalFormatPhoneNumber
DataType y phoneUtil?Tengo un método de ayuda útil para encargarme de esto en función de una respuesta publicada anteriormente:
Importaciones:
import com.google.i18n.phonenumbers.NumberParseException import com.google.i18n.phonenumbers.PhoneNumberUtil
Función:
fun parseCountryCode( phoneNumberStr: String?): String { val phoneUtil = PhoneNumberUtil.getInstance() return try { // phone must begin with '+' val numberProto = phoneUtil.parse(phoneNumberStr, "") numberProto.countryCode.toString() } catch (e: NumberParseException) { "" } }
fuente
Utilice un bloque de captura de prueba como el siguiente:
try { const phoneNumber = this.phoneUtil.parseAndKeepRawInput(value, this.countryCode); }catch(e){}
fuente
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:
/// <summary> /// Returns the Country based on an international dialing code. /// </summary> 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
fuente
Si la cadena que contiene el número de teléfono siempre comenzará de esta manera (+33 u otro código de país), debe usar regex para analizar y obtener el código de país y luego usar la biblioteca para obtener el país asociado al número.
fuente
Aquí hay una respuesta sobre cómo encontrar el código de llamada del país sin usar bibliotecas de terceros (como lo hace un desarrollador real):
Obtenga una lista de todos los códigos de países disponibles, Wikipedia puede ayudar aquí: https://en.wikipedia.org/wiki/List_of_country_calling_codes
Analice los datos en una estructura de árbol donde cada dígito es una rama.
Recorra su árbol dígito a dígito hasta llegar a la última rama; ese es el código de su país.
fuente