Десятичный формат Java:как отклонить «неверный» ввод с сгруппированными десятичными знаками?
-
16-09-2019 - |
Вопрос
При использовании следующего NumberFormat:
NumberFormat amountFormat = NumberFormat
.getNumberInstance(I18N.getThreadLocale());
amountFormat.setMaximumFractionDigits(2);
amountFormat.setMinimumFractionDigits(2);
Я получаю следующие результаты при анализе через
System.out.println(amountFormat.parse(value));
- 10,50 => 1050
- 10,5 => 105
- 0,25 => 25
Я знаю, что в Locale.ENGLISH "," является разделителем групп.Но я не думаю, что приведенные выше результаты имеют смысл.И наши клиенты странно относятся к такому форматированию.
Как отключить эту группировку?
Я хотел бы получить следующие результаты:
- 10,50 => ParseException
- 10,5 => ParseException
- 0,25 => ParseException
Есть ли стандартный способ сделать это?Или мне нужно запрограммировать свой собственный NumberFormat?
Решение
Одной из проблем является символ группировки («,» в английской локали).Чтобы отключить поддержку группировки для экземпляра NumberFormat, вы можете просто вызвать setGroupingUsed(false).
Однако это приводит к другой проблеме, а именно к тому, что NumberFormat анализирует строку с начала, пока не достигнет неизвестного символа.parse("12foo") вернет 12, так же как parse("10,50") вернет 10, если группировка отключена.Чтобы проверить, была ли действительно проанализирована вся входная строка, вам необходимо использовать методы синтаксического анализа с аргументом ParsePosition и проверить его индекс, а также проверить, была ли входная строка проанализирована до конца или анализатор остановился на более ранней позиции в строке.