2011-07-06 14 views
12

Usando DecimalFormat da no es una excepción de análisis cuando se utiliza este tipo de número:DecimalFormat convierte números con dígitos no

123hello

que, evidentemente, no es realmente un número, y convierte a 123,0 valor. ¿Cómo puedo evitar este tipo de comportamiento?

Como nota al margen hello123 da una excepción, que es correcta.

Gracias, Marcel

+0

Mira esta http://stackoverflow.com/questions/4324997/why-does-decimalformat-allow-characters-as-suffix –

Respuesta

9

Para hacer el análisis exacto, puede utilizar

public Number parse(String text, 
       ParsePosition pos) 

pos de inicialización a 0 y cuando su acabado que le dará el índice después del último carácter que se utilizó.

Puede comparar esto con la longitud de la cadena para asegurarse de que el análisis fue preciso.

http://download.oracle.com/javase/1.4.2/docs/api/java/text/DecimalFormat.html#parse%28java.lang.String,%20java.text.ParsePosition%29

+1

Sólo una Es una pena que la API no permita hacer algo como esto: decimalFormat.setStrict (true) (significado estricto que no permite 123hello como número). El punto es que no siempre puede controlar la llamada para analizarse usted mismo. Otras bibliotecas pueden usar el objeto de formato. ¡Muchas gracias por la respuesta! – marcel

0

puede verificar que es numérico usando una expresión regular:

String input = "123hello"; 
double d = parseDouble(input); // Runtime Error 

public double parseDouble(String input, DecimalFormat format) throws NumberFormatException 
{ 
    if (input.equals("-") || input.equals("-.")) 
     throw NumberFormatException.forInputString(input); 
    if (!input.matches("\\-?[0-9]*(\\.[0-9]*)?")) 
     throw NumberFormatException.forInputString(input); 

    // From here, we are sure it is numeric. 
    return format.parse(intput, new ParsePosition(0)); 
} 
+2

Su código no trae nada más que Double.parseDouble ("123hello"). Y el punto de DecimalFormat es analizar los números internacionalizados. 123 456,78 es un número decimal válido en la configuración regional francesa. –

+0

@JB: de hecho, quería ser rápido: D –

+0

¡Gracias por su respuesta! – marcel

1

Ampliando @ respuesta de Kal, aquí hay un método de utilidad que se puede utilizar con cualquier formateador hacer "estricta" de análisis (utiliza Commons StringUtils apache):

public static Object parseStrict(Format fmt, String value) 
    throws ParseException 
{ 
    ParsePosition pos = new ParsePosition(0); 
    Object result = fmt.parseObject(value, pos); 
    if(pos.getIndex() < value.length()) { 
     // ignore trailing blanks 
     String trailing = value.substring(pos.getIndex()); 
     if(!StringUtils.isBlank(trailing)) { 
      throw new ParseException("Failed parsing '" + value + "' due to extra trailing character(s) '" + 
            trailing + "'", pos.getIndex()); 
     } 
    } 
    return result; 
} 
+0

¡Gracias por su respuesta! – marcel

Cuestiones relacionadas