Come analizzare i numeri più severi di quello che fa NumberFormat in Java?
-
29-10-2019 - |
Domanda
Convaliderò l'input dell'utente da un modulo.
Analizzo l'input con NumberFormat
, ma è malvagio e permette quasi tutto. C'è un modo per analizzare il numero più severo?
Ad esempio, vorrei non permettere questi tre input, per un numero intero, ma Numberformat
consentirli tutti:
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());
Nessuna soluzione corretta
Altri suggerimenti
Forse questo aiuta:
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");
}
(Grazie a Numero rigoroso Analisi su mynetgear.net)
Ci sono molti modi per farlo:
- Regex - Controlla se questo
matches("\\d+")
- insieme a
javax.validation
-@Digits(fraction=0, integer=5)
- Apache Commons
IntegerValidator
Integer.parseInt(String)
lancerà una NumberFormatexception su tutti i tuoi esempi. Non sono sicuro che sia quello che stai cercando, ma è sicuramente "più severo".
Utilizzare DecimalFormat con una stringa di pattern di formato.
Dai un'occhiata a DecimalFormat che è una sottoclasse di NumberFormat http://docs.oracle.com/javase/6/docs/api/java/text/decimalformat.html
Decimalformat myFormatter = new decimalFormat ("###. ###");
Non userei la routine del formato numerico di Java, specialmente con le impostazioni locali se ti preoccupi della convalida.
Locale numberLocale = new Locale(“es”,”ES");
NumberFormat nf = NumberFormat.getInstance(numberLocale);
ParsePosition pos = new ParsePosition(0);
Number test = nf.parse("0.2", pos);
Ci si aspetterebbe che ci sia un problema qui, ma no. Il test è uguale a 2 e POS ha un indice di 3 e un indice di errore di -1.
Ho rinunciato a scrivere la mia classe di validazione e sono andato con Widget di Nebula Testo formato
È stato scritto sull'API Widget SWT, ma puoi facilmente adattare il Classe Numberformatter