我正在通过ICU4J
使用CompactDecimalFormat
的{{1}}。在Android版本24和25 which corresponds to ICU
version 56
上,我没有看到使用setMaximumFractionDigits
或setMaximumIntegerDigits
的预期行为。但是,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 56
(Android API 28
)中起作用?