Java DecimalFormat: como rejeitar a entrada “inválido” com decimais agrupadas?
-
16-09-2019 - |
Pergunta
Ao usar o seguinte NumberFormat:
NumberFormat amountFormat = NumberFormat
.getNumberInstance(I18N.getThreadLocale());
amountFormat.setMaximumFractionDigits(2);
amountFormat.setMinimumFractionDigits(2);
Eu recebo os seguintes resultados ao analisar via
System.out.println(amountFormat.parse(value));
- 10,50 => 1050
- 10,5 => 105
- 0,25 => 25
Eu sei que em Locale.ENGLISH a "" é o separador de grupo. Mas eu não acho que os resultados acima faz sentido. E nossos clientes a obter estranho sobre esta formatação.
Como posso desativar este agrupamento?
Eu gostaria de ter os seguintes resultados:
- 10,50 => ParseException
- 10,5 => ParseException
- 0,25 => ParseException
Existe uma maneira padrão para fazer isso? Ou eu tenho para programar minha própria NumberFormat?
Solução
Um dos problemas é o caráter agrupamento ( '' em um local Inglês). Para desativar o suporte de agrupamento para a instância NumberFormat, você pode simplesmente invocar setGroupingUsed (false).
Este, porém, leva a um problema diferente, ou seja, que analisa NumberFormat do início da cadeia, até que ele atinja um caráter desconhecido. analisar ( "12foo") irá retornar 12, assim como parse ( "10,50") retornará 10 se agrupar está desativado. Para verificar se toda a cadeia de entrada realmente foi analisado, você tem que usar os métodos de análise com um argumento ParsePosition e verificar o seu índice e se a cadeia de entrada foi analisado para o fim ou se o analisador parou em uma posição anterior na cadeia.