如何格式化具有固定小数位数的 JSR-385 数量?
How do I format a JSR-385 Quantity with fixed number of decimal digits?
我正在尝试将硬编码格式转换为 Java Units API 实现。
现有代码输出(对于本例,以度为单位的温度值)有两位小数。例如,38.70°C。虽然我希望允许用户指定他们自己的格式代码(更改的 the end-goal),但我认为保留遗留行为以便让人们有机会迁移会很有用。
existing code 看起来像:
return String.format("%.2f\u00B0C", this.temperature);
我尝试使用的代码如下所示:
DecimalFormat numberFormat = (DecimalFormat) DecimalFormat.getInstance();
numberFormat.setMinimumFractionDigits(2);
numberFormat.setMaximumFractionDigits(2);
NumberDelimiterQuantityFormat formatter =
NumberDelimiterQuantityFormat.builder()
.setNumberFormat(numberFormat)
.setDelimiter("")
.setUnitFormat(SimpleUnitFormat.getInstance())
.build();
return formatter.format(temperature);
它确实格式化了,但没有指定的精度。我希望 38.70°C
但得到 38.70000076293945℃
.
如果我这样做
numberFormat.format(temperature.getValue().floatValue());
然后它会正确格式化(“38.70”)。所以我觉得DecimalFormat基本没问题。
我考虑过手动构建我的格式。然而,这对我想做的事情并没有真正起作用 - 传入 NumberDelimiterQuantityFormat
(或适用的接口)。
任何人都可以建议一种适当的方法来格式化具有固定小数精度的 Quantity<>
吗?
首先,我完全不熟悉 Java 单元 API 和这个实现,但这似乎是一个有趣的问题,所以我调查了一下。
我查看了 NumberDelimiterQuantityFormat 的实现,就在 format
方法的实现中,它根据分数 [=19] 修改了 NumberFormat
的 maxiumFractionDigits
=]
if (quantity != null && quantity.getValue() != null) {
fract = getFractionDigitsCount(quantity.getValue().doubleValue());
}
if (fract > 1) {
numberFormat.setMaximumFractionDigits(fract + 1);
}
这对我来说意义不大,原因有二:
它首先否定了 NumberFormat
的全部原因,尤其是在浮点数的上下文中,实际上不可能避免多余的小数位。
它在一个不期望的方法中修改了 NumberDelimiterQuantityFormat
的内部状态。
我应该先检查一下,但实际上有一个issue about this,现在“正在分析”几个月了。也许在那里问问是有意义的。
我正在尝试将硬编码格式转换为 Java Units API 实现。
现有代码输出(对于本例,以度为单位的温度值)有两位小数。例如,38.70°C。虽然我希望允许用户指定他们自己的格式代码(更改的 the end-goal),但我认为保留遗留行为以便让人们有机会迁移会很有用。
existing code 看起来像:
return String.format("%.2f\u00B0C", this.temperature);
我尝试使用的代码如下所示:
DecimalFormat numberFormat = (DecimalFormat) DecimalFormat.getInstance();
numberFormat.setMinimumFractionDigits(2);
numberFormat.setMaximumFractionDigits(2);
NumberDelimiterQuantityFormat formatter =
NumberDelimiterQuantityFormat.builder()
.setNumberFormat(numberFormat)
.setDelimiter("")
.setUnitFormat(SimpleUnitFormat.getInstance())
.build();
return formatter.format(temperature);
它确实格式化了,但没有指定的精度。我希望 38.70°C
但得到 38.70000076293945℃
.
如果我这样做
numberFormat.format(temperature.getValue().floatValue());
然后它会正确格式化(“38.70”)。所以我觉得DecimalFormat基本没问题。
我考虑过手动构建我的格式。然而,这对我想做的事情并没有真正起作用 - 传入 NumberDelimiterQuantityFormat
(或适用的接口)。
任何人都可以建议一种适当的方法来格式化具有固定小数精度的 Quantity<>
吗?
首先,我完全不熟悉 Java 单元 API 和这个实现,但这似乎是一个有趣的问题,所以我调查了一下。
我查看了 NumberDelimiterQuantityFormat 的实现,就在 format
方法的实现中,它根据分数 [=19] 修改了 NumberFormat
的 maxiumFractionDigits
=]
if (quantity != null && quantity.getValue() != null) { fract = getFractionDigitsCount(quantity.getValue().doubleValue()); } if (fract > 1) { numberFormat.setMaximumFractionDigits(fract + 1); }
这对我来说意义不大,原因有二:
它首先否定了
NumberFormat
的全部原因,尤其是在浮点数的上下文中,实际上不可能避免多余的小数位。它在一个不期望的方法中修改了
NumberDelimiterQuantityFormat
的内部状态。
我应该先检查一下,但实际上有一个issue about this,现在“正在分析”几个月了。也许在那里问问是有意义的。