如何格式化具有固定小数位数的 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] 修改了 NumberFormatmaxiumFractionDigits =]

if (quantity != null && quantity.getValue() != null) {
    fract = getFractionDigitsCount(quantity.getValue().doubleValue());
}
if (fract > 1) {
    numberFormat.setMaximumFractionDigits(fract + 1);
}

Source

这对我来说意义不大,原因有二:

  1. 它首先否定了 NumberFormat 的全部原因,尤其是在浮点数的上下文中,实际上不可能避免多余的小数位。

  2. 它在一个不期望的方法中修改了 NumberDelimiterQuantityFormat 的内部状态。

我应该先检查一下,但实际上有一个issue about this,现在“正在分析”几个月了。也许在那里问问是有意义的。