JDK 12 Early Access Build 24引入了对紧凑数字格式的支持 。 JDK-8188147(紧凑数字格式支持)CSR的“摘要”是简单的句子,“添加了对JDK中紧凑/短数字格式的支持。” 相同的CSR还提供了详细的“解决方案”部分,该背景提供了为每个语言环境以多种紧凑形式提供数字以及添加到JDK以支持此功能的构造/ API(新类,新枚举,新方法等)的背景。
每个语言环境中数字的紧凑和简短格式的表示均基于Unicode公共语言环境数据存储库(CLDR) 。 新添加的类java.text.CompactNumberFormat
具有类级别的Javadoc注释 ,这些注释提供了大量有关如何以“短”和“长”紧凑数字格式表示数字的详细信息。 该类的Javadoc注释还指定与自定义数字格式相关的紧凑数字模式,格式,解析和舍入(默认为RoundingMode.HALF_EVEN )。
Nishit Jain在要求对 JDK 12中增加紧凑数字格式的要求进行审查时写道:
现有的NumberFormat API为格式化和解析数字提供了基于语言环境的支持,其中包括格式化小数,百分数,货币等,但是缺少将数字格式化为人类可读或紧凑形式的支持。 此RFE添加了该功能,以紧凑格式格式化十进制数(例如,在en_US语言环境中为1000-> 1K,1000000-> 1M),这对于显示空间有限的环境很有用,因此可以显示格式化的字符串在那个有限的空间里。 它是由LDML的紧凑数字格式规范定义的。
http://unicode.org/reports/tr35/tr35-numbers.html#Compact_Number_Formats
通过代码示例来了解紧凑的数字格式可能是最容易的。 下面的类( CompactNumberFormatDemo
)是根据JDK 12 Early Access Build 24编译和执行的。
package dustin.examples.jdk12.format;
import static java.lang.System.out;
import java.text.NumberFormat;
import java.util.Locale;
/**
* Demonstrate Compact Number Format support added to
* JDK 12 as of Early Access Build 24 (see also
* JDK-8177552: Compact Number Formatting support).
*/
public class CompactNumberFormatDemo
{
private static void demonstrateCompactNumberFormatting(final long numberToFormat)
{
final NumberFormat numberFormatDefault
= NumberFormat.getCompactNumberInstance();
final NumberFormat numberFormatUsLong
= NumberFormat.getCompactNumberInstance(Locale.US, NumberFormat.Style.LONG);
final NumberFormat numberFormatUkShort
= NumberFormat.getCompactNumberInstance(Locale.UK, NumberFormat.Style.SHORT);
final NumberFormat numberFormatUkLong
= NumberFormat.getCompactNumberInstance(Locale.UK, NumberFormat.Style.LONG);
final NumberFormat numberFormatFrShort
= NumberFormat.getCompactNumberInstance(Locale.FRANCE, NumberFormat.Style.SHORT);
final NumberFormat numberFormatFrLong
= NumberFormat.getCompactNumberInstance(Locale.FRANCE, NumberFormat.Style.LONG);
final NumberFormat numberFormatGrShort
= NumberFormat.getCompactNumberInstance(Locale.GERMANY, NumberFormat.Style.SHORT);
final NumberFormat numberFormatGrLong
= NumberFormat.getCompactNumberInstance(Locale.GERMANY, NumberFormat.Style.LONG);
final NumberFormat numberFormatItShort
= NumberFormat.getCompactNumberInstance(Locale.ITALY, NumberFormat.Style.SHORT);
final NumberFormat numberFormatItLong
= NumberFormat.getCompactNumberInstance(Locale.ITALY, NumberFormat.Style.LONG);
out.println("Demonstrating Compact Number Formatting on '" + numberToFormat + "':");
out.println("\tDefault: " + numberFormatDefault.format(numberToFormat));
out.println("\tUS/Long: " + numberFormatUsLong.format(numberToFormat));
out.println("\tUK/Short: " + numberFormatUkShort.format(numberToFormat));
out.println("\tUK/Long: " + numberFormatUkLong.format(numberToFormat));
out.println("\tFR/Short: " + numberFormatFrShort.format(numberToFormat));
out.println("\tFR/Long: " + numberFormatFrLong.format(numberToFormat));
out.println("\tGR/Short: " + numberFormatGrShort.format(numberToFormat));
out.println("\tGR/Long: " + numberFormatGrLong.format(numberToFormat));
out.println("\tIT/Short: " + numberFormatItShort.format(numberToFormat));
out.println("\tIT/Long: " + numberFormatItLong.format(numberToFormat));
}
/**
* Main demonstration executable.
* @param arguments Command-line arguments: none expected.
*/
public static void main(final String[] arguments)
{
demonstrateCompactNumberFormatting(15);
demonstrateCompactNumberFormatting(150);
demonstrateCompactNumberFormatting(1500);
demonstrateCompactNumberFormatting(15000);
demonstrateCompactNumberFormatting(150000);
demonstrateCompactNumberFormatting(1500000);
demonstrateCompactNumberFormatting(15000000);
}
}
执行后,以上代码将以下内容写入标准输出:
Demonstrating Compact Number Formatting on '15':
Default: 15
US/Long: 15
UK/Short: 15
UK/Long: 15
FR/Short: 15
FR/Long: 15
GR/Short: 15
GR/Long: 15
IT/Short: 15
IT/Long: 15
Demonstrating Compact Number Formatting on '150':
Default: 150
US/Long: 150
UK/Short: 150
UK/Long: 150
FR/Short: 150
FR/Long: 150
GR/Short: 150
GR/Long: 150
IT/Short: 150
IT/Long: 150
Demonstrating Compact Number Formatting on '1500':
Default: 2K
US/Long: 2 thousand
UK/Short: 2K
UK/Long: 2 thousand
FR/Short: 2 k
FR/Long: 2 millier
GR/Short: 1.500
GR/Long: 2 Tausend
IT/Short: 1.500
IT/Long: 2 mille
Demonstrating Compact Number Formatting on '15000':
Default: 15K
US/Long: 15 thousand
UK/Short: 15K
UK/Long: 15 thousand
FR/Short: 15 k
FR/Long: 15 mille
GR/Short: 15.000
GR/Long: 15 Tausend
IT/Short: 15.000
IT/Long: 15 mila
Demonstrating Compact Number Formatting on '150000':
Default: 150K
US/Long: 150 thousand
UK/Short: 150K
UK/Long: 150 thousand
FR/Short: 150 k
FR/Long: 150 mille
GR/Short: 150.000
GR/Long: 150 Tausend
IT/Short: 150.000
IT/Long: 150 mila
Demonstrating Compact Number Formatting on '1500000':
Default: 2M
US/Long: 2 million
UK/Short: 2M
UK/Long: 2 million
FR/Short: 2 M
FR/Long: 2 million
GR/Short: 2 Mio.
GR/Long: 2 Million
IT/Short: 2 Mln
IT/Long: 2 milione
Demonstrating Compact Number Formatting on '15000000':
Default: 15M
US/Long: 15 million
UK/Short: 15M
UK/Long: 15 million
FR/Short: 15 M
FR/Long: 15 million
GR/Short: 15 Mio.
GR/Long: 15 Millionen
IT/Short: 15 Mln
IT/Long: 15 milioni
通过Early Access Build 24添加到JDK 12的紧凑数字格式支持允许格式化和解析以特定于语言环境的“长”或“短”紧凑形式的数字表示形式。
翻译自: https://www.javacodegeeks.com/2019/01/compact-number-formatting-comes-jdk-12.html