Java DecimalFormat: come rifiutare di ingresso “non valido” con i decimali raggruppate?
-
16-09-2019 - |
Domanda
Quando si utilizza il seguente NumberFormat:
NumberFormat amountFormat = NumberFormat
.getNumberInstance(I18N.getThreadLocale());
amountFormat.setMaximumFractionDigits(2);
amountFormat.setMinimumFractionDigits(2);
Ottengo i seguenti risultati durante l'analisi tramite
System.out.println(amountFormat.parse(value));
- 10,50 => 1050
- 10,5 => 105
- 0,25 => 25
So che in Locale.ENGLISH il "" è il separatore di gruppo. Ma non credo che i risultati di cui sopra hanno senso. E i nostri clienti ottengono strano su questa formattazione.
Come faccio a disattivare questo raggruppamento?
Mi piacerebbe avere i seguenti risultati:
- 10,50 => ParseException
- 10,5 => ParseException
- 0,25 => ParseException
C'è un modo standard per fare questo? O devo programmare il mio NumberFormat?
Soluzione
Un problema è il carattere di raggruppamento ( '' in un locale inglese). Per disabilitare il raggruppamento il supporto per l'istanza NumberFormat, si può semplicemente richiamare setGroupingUsed (false).
Questo tuttavia, porta ad un problema differente, e cioè che NumberFormat analizza dall'inizio della stringa, fino a raggiungere un carattere incognito. parse ( "12foo") restituirà 12, proprio come parse ( "10,50") restituirà 10 se il raggruppamento è disattivato. Per verificare se l'intera stringa di input è stato effettivamente analizzato, è necessario utilizzare i metodi di parsing con un argomento ParsePosition e verificare il suo indice e se la stringa di input è stato analizzato alla fine o se il parser fermato a una precedente posizione nella stringa.