此测试失败:
@Test
fun testFormatRoundedUp() {
val formatter = NumberFormat.getCurrencyInstance()
formatter.maximumFractionDigits = 0
formatter.roundingMode = UP
formatter.currency = Currency.getInstance("USD")
val decimal = 1 / 100.toDouble()
assertThat(formatter.format(decimal)).isEqualTo("$1")
}
实际输出为“$ 0”。
“UP”不是我想要的舍入模式吗? AFAICT来自文档,它是。当我连接调试器时,decimal
是0.01
,所以这似乎不是问题。我也试过非货币数字格式,它有相同的行为
答案 0 :(得分:0)
主要问题是RoudingMode
:
每个舍入模式指示如何计算舍入结果的最低有效返回数字。
因此,换句话说,0.01
四舍五入为0.1
(最低有效数字为四舍五入)......当您将setMaximumFractionDigits
设为0
时,所有丢弃十进制数字只留下0
所以,你必须实现一些逻辑来将数字四舍五入,如果你想要舍入两个不太重要的数字(或搜索如何做...我现在正在搜索,我可能会在稍后更新这个答案)。< / p>
<强>更新强>
使用BigDecimal
可以实现您想要的效果。它支持您想要的“递归回合”操作。在java中,您的代码将变为:
@Test
public void testFormatRoundedUp() {
NumberFormat formatter = NumberFormat.getCurrencyInstance();
formatter.setMaximumFractionDigits(0);
formatter.setCurrency(Currency.getInstance("USD"));
double decimal = 1 / 100.0;
BigDecimal decimalValue = new BigDecimal(decimal);
Assert.assertThat("Format: 0.01", formatter.format(decimalValue.setScale(0, RoundingMode.UP)), equalTo("US$ 1"));
}