ICU4J CompactDecimalFormat版本56 setMaximumFractionDigits,setMaximumIntegerDigits不起作用,但setMaximumSignificantDigits有效

时间:2019-03-16 21:13:01

标签: android localization internationalization icu icu4j

我正在通过ICU4J使用CompactDecimalFormat的{​​{1}}。在Android版本24和25 which corresponds to ICU version 56上,我没有看到使用setMaximumFractionDigitssetMaximumIntegerDigits的预期行为。但是,setMaximumSignificantDigits可以按预期工作,我只需要在使用数学之前先做一下数学即可:

android.icu.text.CompactDecimalFormat

其中long number = // get a number from somehwere CompactDecimalFormat compactDecimalFormat = CompactDecimalFormat.getInstance(Locale.getDefault(), CompactStyle.SHORT); compactDecimalFormat.setMaximumSignificantDigits( getMaximumSignificantDigitsFor3IntegerDigitsAnd1FractionDigit(number) ) String formatted = compactDecimalFormat.format(number); 是:

getMaximumSignificantDigitsFor3IntegerDigitsAnd1FractionDigit

ICU4J CompactDecimalFormat文档中,我找不到不使用private int getMaximumSignificantDigitsFor3IntegerDigitsAnd1FractionDigit(long number) { if (thousands >= 1000) { val millions = number / 1_000_000L; if (millions >= 1000) { val billions = number / 1_000_000_000L; if (billions >= 1000) { // 1,234.5 B or 1.2345T return 5; } else if (billions >= 100) { // 123.4 B return 4; } else if (billions >= 10) { // 12.3 B return 3; } else if (billions >= 1) { // 1.2 B return 2; } else { // should never happen, use 4 to be safe return 4; } } else if (millions >= 100) { // 123.4M return 4; } else if (millions >= 10) { // 12.3M return 3; } else if (millions >= 1) { // 1.2M return 2; } else { // shouldn't happen, use 4 to be safe return 4; } } else if (thousands >= 100) { // 123.4K return 4; } else if (thousands >= 10) { // 12.3K return 3; } else if (thousands >= 1) { // 1.2K or 1200 return 2; } else { // 123 exactly, no fractional component return 3; } } setMaximumIntegerDigits的任何内容。

我创建了一个gist,它演示了一堆相关的测试用例。我已将以下十万个案例包括在内:

setMaximumIntegerDigits

有什么想法为什么不能在// Fails on API 24. Works on API 28 @Test public void testSignificantDigitsUsedFalseThenSetMaximumIntegerDigitsThenSetMaximumFractionDigitsForHundredThousandish() { testObject.setSignificantDigitsUsed(false); testObject.setMaximumIntegerDigits(3); testObject.setMaximumFractionDigits(1); final String actual = testObject.format(123_456); assertEquals("123.5K", actual); // rounding // API 24: "100K" // API 28: "123.5K" } // Fails on API 24. Works on API 28 @Test public void testSetMaximumIntegerDigitsThenSetMaximumFractionDigitsThenSetSignificantDigitsUsedFalseHundredThousandish() { testObject.setMaximumIntegerDigits(3); testObject.setMaximumFractionDigits(1); testObject.setSignificantDigitsUsed(false); final String actual = testObject.format(123_456); assertEquals("123.5K", actual); // rounding // API 24: "100K" // API 28: "123.5K" } // Works on API 24 and API 28 @Test public void testSetMaximumSignificantDigitsHundredThousandish() { testObject.setMaximumSignificantDigits(4); final String actual = testObject.format(123_456); assertEquals("123.5K", actual); // rounding } Android API 24)中起作用,而在ICU 56Android API 28)中起作用?

0 个答案:

没有答案