Extraiga el código de país del número de teléfono [libphonenumber]

82

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.

mrroboaat
fuente
1
El primer enlace se basa en el código de país del teléfono. Pero en mi caso, puedo tener una cadena que sea un número de teléfono francés con un teléfono inglés. Entonces, si recupero la configuración regional actual, tendré "EN" pero mi cadena será un código de país francés
mrroboaat

Respuestas:

128

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());
}
mrroboaat
fuente
6
esta biblioteca loca de wackadoo es increíble y es mil millones de veces mejor que la sbiblioteca PhoneNumberUtil incluida en Android
Aphex
@aat, ¿podría decirme cómo funcionará sin usar countryISOCode en (phoneUtil.parse (phone, "");) su respuesta, por favor responda
Ash
1
@Shweta Si tiene una pregunta, publíquela en un nuevo hilo en SO
mrroboaat
1
@aat ok, pero su respuesta no es correcta, sin dar ningún paísISOCode este código no se ejecutará
Ash
3
El parámetro @Schweta defaultRegion debe ser nulo: defaultRegion: el código de región de dos letras ISO 3166-1 que indica la región de la que esperamos que sea el número. Esto solo se usa si el número que se está analizando no está escrito en formato internacional. El country_code para el número en este caso se almacenaría como el de la región predeterminada proporcionada. Si se garantiza que el número comienza con un '+' seguido del código de llamada del país, entonces se puede proporcionar "ZZ" o nulo.
xnagyg
3

Aquí 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á

Thilina Rubasingha
fuente
1
¿Qué es internationalFormatPhoneNumberDataType y phoneUtil?
Kartheek s
1
el parámetro givenPhoneNumber no es una cadena, debe ser un número de teléfono ya analizado en el que necesita la región predeterminada para generar
Gil SH
@GilSH sí givenPhoneNumber no String, es un objeto PhoneNumber.
Thilina Rubasingha
1
esta respuesta me ayuda
luttu android
¿Qué se le daPhoneNumber ??
TharakaNirmana
3

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) {
            ""
        }
    }
Ali Nawaz
fuente
0

Utilice un bloque de captura de prueba como el siguiente:

try { 

const phoneNumber = this.phoneUtil.parseAndKeepRawInput(value, this.countryCode);

}catch(e){}
soni kumari
fuente
0

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

Peter Huber
fuente
-5

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.

yjajkiew
fuente
Existen muchos códigos de países diferentes: http://en.wikipedia.org/wiki/List_of_country_calling_codes
mrroboaat
-24

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.

Unobic
fuente
26
Estoy rechazando esto debido a este comentario: "Aquí hay una respuesta sobre cómo encontrar el código de llamada de un país sin usar bibliotecas de terceros (como lo hace un desarrollador real):" ¿Por qué crees que el software progresa? Es porque la gente no tiene que reinventar la rueda cada vez. Un desarrollador REAL usa bibliotecas de terceros porque es inteligente.
Carl B
2
Tu opinión personal no hace que mi respuesta sea incorrecta, ¿verdad? De hecho, esta es la única respuesta correcta y a prueba de balas hasta ahora ... y sí, no requiere ningún software de terceros para funcionar. Puede comprar mi solución si insiste en utilizar bibliotecas de terceros.
Unobic
2
Actualizar una biblioteca es más fácil que ir continuamente a una página de Wikipedia para verificar si la lista de códigos de llamadas de países ha cambiado.
Flimm
@Unobic Lo siento hombre. No deberían votar debido a una opinión personal sobre Stackoverflow. Estaba buscando exactamente tu respuesta al buscar. Así que gracias de mi parte. Tenga mi voto a favor al menos.
Ybrin