是否可以在 DecimalFormat 解析中指定精确的小数位数?

Is it possible to specify exact number of fractional digits in DecimalFormat parsing?

我正在使用 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;
}

有什么建议吗?

听起来您正在尝试验证条件而不是将字符串转换为给定格式。您可以使用正则表达式来执行此操作。这是一个示例方法,我相信它可以满足您的需求

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

这将 return 对于“10.33”为真,但对于“10.3”为假。如果这不能回答您的问题,请告诉我。

这是关于 setMinimumIntegerDigits 的文档:https://docs.oracle.com/javase/8/docs/api/java/text/DecimalFormat.html#setMinimumIntegerDigits-int-

newValue - the minimum number of integer digits to be shown; [...].

据我了解,这不是必需的,只是作为输出格式。

查看 DecimalFormat 的可用函数,我看不到任何可以提供小数位数的函数。

但是,由于您使用的是 setParseBigDecimal(true),因此解析字符串会给您一个 BigDecimal,它使您可以访问 precision 函数:https://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html#precision--

因此,如果您绝对想检查解析结果(而不是字符串本身)的位数是否正确,我的建议是:

  • 将最小小数位数设置为 0
  • 取字符串
  • BigDecimal
  • 中解析
  • 使用BigDecima::precision函数检查位数是否正确。

希望对您有所帮助。

如果价格有小数点 (.),则小数点 (.) 总是有数字作为前缀和后缀。即'0.0' 整数价格可以接受。 最多 2 个小数位。

5, 5.0, 5.00 接受 0, 0.0, 0.00 5. .5, 5.000, ., .0, .00, .000, 0. 字符串 = 错误