我正在尝试将硬编码格式转换为Java Units API实现。
现有代码输出(在本例中,温度值以度为单位(,带有两位小数。例如,38.70°C。虽然我希望允许用户指定自己的格式代码(这是更改的最终目标(,但我认为保留遗留行为会很有用,这样人们就有机会迁移。
现有代码看起来像:
return String.format("%.2fu00B0C", 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 Unit API和这个实现完全不熟悉,但这似乎是一个有趣的问题,所以我研究了它
我看过NumberDelimiterQuantityFormat的实现,在format
方法的实现中,它根据分数修改了NumberFormat
的maxiumFractionDigits
if (quantity != null && quantity.getValue() != null) { fract = getFractionDigitsCount(quantity.getValue().doubleValue()); } if (fract > 1) { numberFormat.setMaximumFractionDigits(fract + 1); }
源
这对我来说没有什么意义,原因有两个:
-
它首先否定了
NumberFormat
的全部原因,尤其是在浮点数字的情况下,几乎不可能避免多余的小数。 -
它以一种不期望的方法修改
NumberDelimiterQuantityFormat
的内部状态。
我应该先检查一下,但实际上有一个问题,那就是"被分析";几个月了。也许进去问问会有意义。