Pregunta

Tengo el siguiente código para analizar una variable de cadena llamado str.

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

Quiero atrapar la excepción lanzada cuando str no es un número sólo para validarlo. El problema que tengo es que siempre does't lanza el ParseException esperado. Cuando la cadena str comienza con un número, pero luego son personajes parece que se pondrá a los primeros caracteres de la cadena y analizar 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 se entiende por este método.

¿Por qué sucede esto? Puedo validarlo en cualquier otra forma? Gracias

¿Fue útil?

Solución

El comportamiento no es extraño, que está diseñado como

  

Analiza el texto desde el comienzo de la cadena dada para producir un número. El método puede no utilizar 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();
} 

Otros consejos

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

  

analiza sintácticamente el texto desde el principio de la   dado cuerda para producir un número. los   método puede no utilizar la totalidad del texto de   la cadena dada.

Si desea ver hasta qué punto analiza el analizador, puede utilizar el otro método posición-consciente . De esta manera se puede comprobar si tiene alguna caracteres que se arrastran. También puede comprobar toda la cadena de caracteres alfanuméricos utilizando, por ejemplo langs comunes isalpha .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top