Pregunta

Estoy validando la entrada del usuario de un formulario.

Analizo la entrada con NumberFormat, pero es malvado y permite casi cualquier cosa. ¿Hay alguna forma de analizar el número más estricto?

Por ejemplo, me gustaría no permitir estas tres entradas, para un entero, sino Numberformat Permitirlos a todos:

NumberFormat nf = NumberFormat.getNumberInstance();
nf.setParseIntegerOnly(true);

Number numberA = nf.parse("99.731");    // 99 (not what the user expect)
Number numberB = nf.parse("99s.231");   // 99 (invalid)
Number numberC = nf.parse("9g9");       // 9  (invalid)

System.out.println(numberA.toString());
System.out.println(numberB.toString());
System.out.println(numberC.toString());

No hay solución correcta

Otros consejos

Tal vez esto ayuda:

String value = "number_to_be_parsed".trim();
NumberFormat formatter = NumberFormat.getNumberInstance();
ParsePosition pos = new ParsePosition(0);
Number parsed = formatter.parse(value, pos);
if (pos.getIndex() != value.length() || pos.getErrorIndex() != -1) {
    throw new RuntimeException("my error description");
}

(Gracias a Seguimiento de números estrictos en mynetgear.net)

Hay muchas maneras de hacer eso:

Integer.parseInt(String) lanzará una NumberFormateException sobre todos sus ejemplos. No estoy seguro de si eso es lo que estás buscando, pero definitivamente es "más estricto".

Use decimalformat con una cadena de patrón de formato.

Eche un vistazo a DecimalFormat que es una subclase de NumberFormat http://docs.oracle.com/javase/6/docs/api/java/text/decimalformat.html

DecimalFormat myFormatter = new DecimalFormat ("###. ###");

No usaría la rutina de formato de número de Java, especialmente con la configuración de la configuración regional si se preocupa por la validación.

    Locale numberLocale = new Locale(“es”,”ES");
    NumberFormat nf = NumberFormat.getInstance(numberLocale);
    ParsePosition pos = new ParsePosition(0);
    Number test = nf.parse("0.2", pos);

Esperaría que haya un problema aquí, pero no ... La prueba es igual a 2 y POS tiene un índice de 3 e índice de error de -1.

Dejé de escribir mi propia clase de validación y fui con Widgets de nebulosa Conexión de formato

Fue escrito sobre la API de widget swt, pero puede adaptar fácilmente el Clase NumberFormatter

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