studio programacion móviles libros libro desarrollo desarrollar curso aprende aplicaciones java

java - móviles - manual de programacion android pdf



API de formato de número de teléfono Java (11)

Analizador de expresiones regulares simple

/** * @param pPhoneNumber * @return true if the phone number is correct */ private boolean isPhoneNumberCorrect(String pPhoneNumber) { Pattern pattern = Pattern .compile("((//+[1-9]{3,4}|0[1-9]{4}|00[1-9]{3})//-?)?//d{8,20}"); Matcher matcher = pattern.matcher(pPhoneNumber); if (matcher.matches()) return true; return false; }

Formato

Hice esto de acuerdo a mis necesidades, y acepta números:

  1. CountryCode-Number
  2. Número

Códigos de país:

Pueden tener un: + , o uno o dos ceros. Luego, puede ser seguido por un - .

Acepta:

  • +456
  • 00456
  • +1234
  • 01234

Todo lo anterior puede o no seguido de a -

Rechaza:

  • 0456
    • debería ser:
      • 00456 o +456 o 04444

Número

Un número simple con 8-20 dígitos.

Acepta:

  • 00456-12345678
  • +457-12345678
  • +45712345678
  • 0045712345678
  • 99999999

¿Extiéndelo?

Siéntase libre, por lo que puede incluir soporte para . o ''('' separadores. Solo asegúrese de escapar de ellos, por ejemplo, para ( use /( .

Tengo una base de datos con millones de números de teléfono con formato libre para todos. Es decir, la IU no impone ninguna restricción y los usuarios están escribiendo lo que quieran.

Lo que estoy buscando es una API de Java que pueda hacer un mejor esfuerzo para convertirlos en un formato coherente. Idealmente, la API tomaría el valor de texto libre y un código de país, y produciría un número de teléfono internacional válido o arrojaría una excepción.

Por ejemplo, un número de teléfono en el sistema puede parecerse a cualquiera de los siguientes:

(555) 478-1123 555-478-1123 555.478.1123 5554781123

Dado el país de EE. UU., La API produciría el valor "+1 (555) 478-1123" para todos estos. El formato exacto no importa, siempre y cuando sea consistente.

También hay números en el sistema sin códigos de área, como "478-1123". En ese caso, esperaría una NoAreaCodeException, o algo similar.

También podría haber datos como "abc", que también debería arrojar excepciones.

Por supuesto, hay innumerables variaciones de los ejemplos que he publicado, así como la enorme complicación de los números de teléfono internacionales, que tienen reglas de validación bastante complicadas. Esta es la razón por la que no consideraría hacer mi propio esfuerzo.

¿Alguien ha visto tal API?


Existen programas comerciales que formatean y validan números de teléfono internacionales, como este, que incluso verifica códigos de área válidos en algunos países. Para América del Norte, el NANPA proporciona algunos recursos para validar los códigos de área.


Las versiones recientes de libphonenumber han agregado metadatos para muchos países nuevos y han agregado muchos más detalles para algunos de los países enumerados anteriormente.

La versión actual del código fuente es r74 y el archivo .jar está en la versión 2.6. Los archivos .jar anteriores se compilaron para Java 1.6, pero a partir de la versión de libphonenumber 2.5.1, ahora se compilan para Java 1.5 y superior.

No olvide que también hay un puerto directo del código para JavaScript. Se puede encontrar en el árbol de códigos fuente en http://code.google.com/p/libphonenumber/source/browse/#svn%2Ftrunk%2Fjavascript

Los informes de errores son bienvenidos. Las actualizaciones de metadatos se fomentan activamente, ya que incluso las listas oficiales de códigos de área publicadas por el gobierno para muchos países están incompletas o desactualizadas.


Lo mejor que encontré fue javax.telephony , que se encuentra aquí: http://java.sun.com/products/javaphone/

Tiene una clase de Dirección, pero lamentablemente esa clase no resolvió tu problema :( Bueno, tal vez puedas encontrar una solución profundizando en ella.

Aparte de eso, mi primera idea fue usar expresiones regulares. Sin embargo, parece ser una especie de mala solución para este problema específico.


Mis propias necesidades fueron muy simples. Solo necesitaba tomar un número de 7 o 10 dígitos y poner separadores (un guion, un punto, una cadena de caracteres, etc.) entre el código de área, el intercambio y el número de intercambio. Cualquier valor pasado al método que no sea todos los dígitos o no tenga una longitud de 7 o 10 simplemente se devuelve. Un valor nulo devuelve una cadena vacía y un valor nulo para el separador se trata como una cadena vacía. Mi código:

import java.util.regex.Matcher; import java.util.regex.Pattern; // ... private String formatPhoneNumber(String phnumber, String separator) { phnumber = (phnumber == null) ? "" : phnumber; if ((phnumber.length() != 7) && (phnumber.length() != 10)) { return phnumber; } // If we get here, ''phnumber'' is for sure either 7 or 10 chars long separator = (separator == null) ? "" : separator; Pattern p = Pattern.compile("([0-9]*)"); Matcher m = p.matcher(phnumber); if (m.matches()) { if (phnumber.length() == 7) { return phnumber.substring(0, 3) + separator + phnumber.substring(4); } else { return phnumber.substring(0, 3) + separator + phnumber.substring(3, 6) + separator + phnumber.substring(6); } // If we get here, it means 1 or more of the chars in ''phnumber'' // is not a digit and so ''phnumber'' is returned just as passed in. return phnumber; }


No creo que haya una manera de reconocer la falta de un código de área a menos que todos los números sean de un país (presumiblemente los EE. UU.), Ya que cada país tiene sus propias reglas para códigos de área.

Comenzaría a buscar información detallada here , here y here ; si hay API para manejarlo (en Java o de otro modo), también podrían estar vinculados allí.


No reinventar la rueda; utiliza una API, por ejemplo http://libphonenumber.googlecode.com/ Esta API también te ofrece un buen formato. Ejemplo :

String number = "(555) 478-1123"; PhoneNumberUtil phoneNumberUtil = PhoneNumberUtil.getInstance(); try { Phonenumber.PhoneNumber phoneNumber = phoneNumberUtil.parse(number, Locale.US.getCountry()); } catch (NumberParseException e) { // error handling }

Incluso podría usar el objeto phoneNumber para darle un buen formato a un número de teléfono válido antes de guardarlo en el DB o lo que sea.


No sé de una API así, pero parece que podría hacerse mediante el uso de expresiones regulares. Probablemente no pueda convertir todos los números a un formato válido, pero la mayoría de ellos.


Para el número francés que se parece a "01 44 55 66 77", podemos usar la siguiente lógica.

DecimalFormatSymbols dfs = new DecimalFormatSymbols(); dfs.setGroupingSeparator('' ''); // sometimes ''.'' is used DecimalFormat decfmt = new DecimalFormat("0,0", dfs); // enable grouping decfmt.setMinimumIntegerDigits(10); // we always have 10 digits decfmt.setGroupingSize(2); // necessary in order to group digits by 2 orders System.out.println(decfmt.format(144556677)); // outputs "01 44 55 66 77"

Una vez que esto se haya podido hacer, con la API del número de teléfono de Google, los otros mencionaron, podemos analizar estas secuencias fácilmente y reformatearlas en otras formas como "+33 1 44 55 66 77" como las siguientes:

Iterable<PhoneNumberMatch> numbers = PhoneNumberUtil.getInstance().findNumbers(textWithPhoneNums, "FR"); for(Iterator<PhoneNumberMatch> iterator = numbers.iterator(); iterator.hasNext(); ){ PhoneNumberMatch pnm = iterator.next(); PhoneNumber number = pnm.number(); System.out.println(PhoneNumberUtil.getInstance().formatOutOfCountryCallingNumber(number, null)); }


Podrías escribir el tuyo (para el formato de teléfono de EE. UU.):

  • Pele todos los caracteres no numéricos de la cadena
  • Compruebe que la cadena restante tenga diez caracteres
  • Ponga paréntesis alrededor de los primeros tres caracteres y una carrera entre el sexto y el séptimo personaje.
  • Anteponga "+1" a la cadena

Actualizar:

Google lanzó recientemente libphonenumber para analizar, formatear, almacenar y validar números de teléfono internacionales.