2010-12-01 17 views
15

Estoy usando DecimalFormat para analizar/validar la entrada del usuario. Desafortunadamente, permite caracteres como un sufijo durante el análisis.¿Por qué DecimalFormat permite caracteres como sufijo?

código Ejemplo:

try { 
    final NumberFormat numberFormat = new DecimalFormat(); 
    System.out.println(numberFormat.parse("12abc")); 
    System.out.println(numberFormat.parse("abc12")); 
} catch (final ParseException e) { 
    System.out.println("parse exception"); 
} 

Resultado:

12 
parse exception 

que en realidad esperar una excepción de análisis para ambos. ¿Cómo puedo decirle al DecimalFormat que no permita la entrada como "12abc"?

Respuesta

16

De la documentación de NumberFormat.parse:

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.

Aquí hay un ejemplo que debería darle una idea de cómo asegurarse de que se considera toda la cadena.

import java.text.*; 

public class Test { 
    public static void main(String[] args) { 
     System.out.println(parseCompleteString("12")); 
     System.out.println(parseCompleteString("12abc")); 
     System.out.println(parseCompleteString("abc12")); 
    } 

    public static Number parseCompleteString(String input) { 
     ParsePosition pp = new ParsePosition(0); 
     NumberFormat numberFormat = new DecimalFormat(); 
     Number result = numberFormat.parse(input, pp); 
     return pp.getIndex() == input.length() ? result : null; 
    } 
} 

de salida:

12 
null 
null 
2

Utilice la sobrecarga parse(String, ParsePosition) del método, y compruebe la .getIndex() de la ParsePosition después del análisis, para ver si coincide con la longitud de la entrada.

Cuestiones relacionadas