Strano comportamento di NumberFormat Java
-
20-09-2019 - |
Domanda
Ho il seguente codice per analizzare una chiamata str variabile String.
NumberFormat formatter = NumberFormat.getInstance();
Number number = formatter.parse(str);
Voglio cogliere l'eccezione generata quando str non è un numero solo per convalidarlo. Il problema che ho è che does't sempre getta il ParseException previsto. Quando la stringa str inizia con un numero, ma poi sono personaggi sembra avere un i primi caratteri della stringa e analizzare come un numero.
Ad esempio:
- se str = "A10", allora è gettato ParseException
- se str = "10 bis", allora non fa eccezione gettata e il numero = 10
Non posso usare Double.parseDouble (str) str perché possono avere virgole e punti simili 1,000.98 e questo formato non è compreso dalla presente metodo.
Perché succede questo? Posso convalidare in altro modo? Grazie
Soluzione
Il comportamento non è strano, è come progettato
Analizza il testo all'inizio della stringa data per produrre un numero. Il metodo non può utilizzare l'intero testo della stringa data.
È possibile utilizzare il metodo di analisi di posizione-aware in questo modo:
public static double parse(String str) throws ParseException {
NumberFormat formatter = NumberFormat.getInstance();
ParsePosition position = new ParsePosition(0);
Number number = formatter.parse(str, position);
if (position.getIndex() != str.length()) {
throw new ParseException("failed to parse entire string: " + str, position.getIndex());
}
return number.doubleValue();
}
Altri suggerimenti
Se si guarda al API , si dice chiaramente:
analizza il testo all'inizio del data stringa per produrre un numero. Il metodo non può utilizzare l'intero testo la stringa data.
Se volete vedere fino a che punto il parser analizzato, è possibile utilizzare il altra posizione consapevole metodo . In questo modo è possibile controllare se avete dei caratteri finali. Si potrebbe anche verificare l'intera stringa di caratteri alfanumerici che utilizzano ad esempio Langs comuni isalpha .