2011-12-07 13 views
7

Sto convalidando l'input dell'utente da un modulo.Come analizzare numeri più rigidi di quelli che NumberFormat fa in Java?

Analizzo l'input con NumberFormat, ma è malvagio e consente quasi tutto. C'è un modo per analizzare il numero più rigoroso?

E.g. Vorrei non permettere a questi tre ingressi, per un intero, ma Numberformat consentire a tutti di loro:

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()); 
+0

come su di convertirlo in una stringa e poi loop sulla stringa e consentire solo caratteri "0" .. "9"?oppure vai su getIntegerInstance(); – ComputerSaysNo

+0

@DorinDuminica: 'getIntegerInstance()' fornisce lo stesso risultato. – Jonas

+1

perché non usare 'Integer.parseInt (String)' –

risposta

1

Se si vuole analizzare un numero intero che consiste di un optional '-' seguito da 1 o più cifre decimali, quindi

int num = Integer.parseInt(str); 

o

long num = Long.parseLong(str); 

Se si vuole semplicemente convalidare e non eseguire la conversione intera, quindi una regex è un'altra alternativa; per esempio.

boolean ok = Pattern.compile("-?\\d+").matches(str); 
+0

Oppure 'str.matches (" -? \\ d + ")' per maggiore concisione. –

0

Utilizzare DecimalFormat con una stringa di modello di formato.

+0

'DecimalFormat' ha lo stesso problema con questo. O hai un esempio? – Jonas

2

Integer.parseInt(String) lancerà una NumberFormatException su tutti i tuoi esempi. Non sono sicuro che sia quello che stai cercando, ma è decisamente "più severo".

6

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 Strict number parsing at mynetgear.net)

+0

Grazie - questa è l'unica soluzione davvero risolutiva! L'altro non considera locale (come il delimitatore decimale). Mi chiedo solo perché diavolo non sia (almeno configurabile) nell'implementazione predefinita :( – Rainer

0

Non vorrei usare di routine formato numerico di Java, in particolare con le impostazioni internazionali se vi preoccupate per la 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 potrebbe aspettare che ci sia un problema qui, ma no .. di prova è uguale a 2 e pos ha un indice di 3 e l'indice di errore di -1.