Можно ли указать точное количество дробных цифр в разборе DecimalFormat? - PullRequest
0 голосов
/ 23 мая 2018

Я использую DecimalFormat для разбора строк, представляющих десятичные числа.Я хотел бы иметь функцию синтаксического анализа, которая проверяет точное количество дробных цифр в строках.Подробно, я хочу проверить, что строка имеет ровно две дробные цифры (например, "1.10" допустимо, "1.1" недействительно).

Возможно ли такое поведение с DecimalFormat?Экземпляр, построенный с использованием следующего метода, не работает.

private static DecimalFormat decimalFormat() {
    final DecimalFormatSymbols decimalFormatSymbols = new DecimalFormatSymbols();
    decimalFormatSymbols.setDecimalSeparator('.');
    final DecimalFormat decimalFormat = new DecimalFormat("#0.00", decimalFormatSymbols);
    decimalFormat.setMinimumFractionDigits(2);
    decimalFormat.setParseBigDecimal(true);
    return decimalFormat;
}

Есть предложения?

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Вот документация по setMinimumIntegerDigits: https://docs.oracle.com/javase/8/docs/api/java/text/DecimalFormat.html#setMinimumIntegerDigits-int-

newValue - минимальное количество отображаемых целых цифр;[...].

Насколько я понимаю, это не является обязательным требованием, а только форматом вывода.

Просмотр доступных функций дляDecimalFormat, я не вижу ничего, что дало бы вам количество цифр дроби.

НО, поскольку вы используете setParseBigDecimal(true), при анализе строки вы получите BigDecimal, что даст вамдоступ к функции precision: https://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html#precision--

Так что я предлагаю, если вы абсолютно хотите проверить результат разбора (а не саму строку) на правильное количество цифр:

  • установить минимальные дробные цифры на 0
  • взять строку
  • разобрать ее в BigDecimal
  • использовать функцию BigDecima::precision, чтобы проверить,правильное количество цифр.

Надеюсь, это поможет.

0 голосов
/ 23 мая 2018

Звучит так, будто вы пытаетесь проверить условие, а не конвертировать строку в заданный формат.Вы можете использовать регулярные выражения для этого.Вот пример метода, который, я считаю, делает то, что вы хотите

public boolean hasTwoFractionalDigits(String text) {
    return Pattern.compile("^\\d+\\.\\d\\d$").matcher(text).find();
}

. Это вернет true для "10.33", но false для "10.3".Если это не ответит на ваш вопрос, дайте мне знать.

...