2010-02-15 19 views
6

Tengo el siguiente código para analizar una variable de cadena llamado str.Extraño comportamiento de NumberFormat Java

NumberFormat formatter = NumberFormat.getInstance(); 
Number number = formatter.parse(str); 

Quiero ver la excepción lanzada cuando str no es solo un número para validarlo. El problema que tengo es que no siempre arroja la ParseException esperada. Cuando la String str comienza con un número pero luego son caracteres, parece obtener los primeros caracteres de la Cadena y analizarlos como un número.

Por ejemplo:

  • si str = "A10", entonces se lanza un ParseException
  • si str = "10a", entonces no es una excepción lanzada y número = 10

no puedo usar Double.parseDouble (str) porque str puede tener comas y puntos como 1,000.98 y este formato no es entendido por este método.

¿Por qué sucede esto? ¿Puedo validarlo de otra manera? Gracias

+1

Yo no quería decir que el comportamiento de NumberFormat estaba mal, pero yo no había entendido bien la API. Pensé que posición era indicar hasta qué personaje quería analizar la Cadena. Ahora entiendo por qué está diseñado de esta manera. Gracias por todos sus torres. – Javi

Respuesta

6

el comportamiento no es raro, es como se ha diseñado

texto Analiza desde el comienzo de la cadena dada para producir un número. El método no puede usar el texto completo de la cadena dada.

Es posible utilizar el método de análisis sintáctico posición consciente de la siguiente manera:

public static double parse(String str) throws ParseException { 
    NumberFormat formatter = NumberFormat.getInstance(); 
    ParsePosition position = new ParsePosition(0); 
    Number number = formatter.parse(str, position); 
    if (position.getIndex() != str.length()) { 
    throw new ParseException("failed to parse entire string: " + str, position.getIndex()); 
    } 
    return number.doubleValue(); 
} 
+0

útil para mí: usar 'setParseIntegerOnly (verdadero)' para lanzar una excepción si encuentra un flotador cuando se esperaba un entero – xdola

6

Si nos fijamos en la API, está claro que dice:

Analiza texto desde el comienzo de la cadena dada para producir un número. El método no podrá utilizar el texto completo de la cadena dada.

Si desea ver hasta qué punto el analizador analizado, puede utilizar el other position-aware method. De esta forma, puedes verificar si tienes algún rastro de caracteres. También puede verificar toda la cadena para caracteres alfanuméricos utilizando, por ejemplo, langs comunes isAlpha.

+0

Lo siento sfussenegger, no vi su publicación antes de actualizar con el método de posición consciente. –

+0

@disown muy probablemente porque ha sido más rápido que yo;) – sfussenegger