是否可以在 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. 字符串 = 错误
我正在使用 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. 字符串 = 错误