帖子“ 紧凑数字格式到JDK 12 ”已经成为java subreddit线程上讨论的主题 。 在那个线程中表达的与紧凑数字格式表示有关的问题涉及显示的精度数字和显示的紧凑数字模式。 可以通过使用CompactNumberFormat.setMinimumFractionDigits(int)
来解决精度数字问题,该方法在“ 使用JDK 12紧凑数字格式使用最小分数数字 ”一文中进行了详细讨论。 这篇文章解决了第二个问题(不喜欢某些语言在预先构建的CompactNumberFormat
实例中使用的紧凑模式)。
据我所能确定的(当然我肯定会遗漏一些东西), CompactNumberFormat
上没有任何方法可以在现有CompactNumberFormat
实例上设置紧凑数字模式。 但是,如果使用CompactNumberFormat
的构造函数获取CompactNumberFormat
的实例(而不是使用NumberFormat的重载静态工厂方法之一),则可以通过该构造函数将紧凑数字模式提供给CompactNumberFormat
的新实例。 这在下一个代码清单(也可以在GitHub上 )中得到证明。
/*** Provides an instance of {@code CompactNumberFormat} that has been* custom created via that class's constructor and represents an* alternate Germany German representation to that provided by an* instance of {@code CompactNumberFormat} obtained via the static* factory methods of {@code NumberFormat} for {@code Locale.GERMANY}.** @return Instance of {@code CompactNumberFormat} with customized* alternate German compact pattern representations.*/
private static CompactNumberFormat generateCustomizedGermanCompactNumberFormat()
{final String[] germanyGermanCompactPatterns= {"", "", "", "0k", "00k", "000k", "0m", "00m", "000m", "0b", "00b", "000b", "0t", "00t", "000t"};final DecimalFormat germanyGermanDecimalFormat= acquireDecimalFormat(Locale.GERMANY);final CompactNumberFormat customGermanCompactNumberFormat= new CompactNumberFormat(germanyGermanDecimalFormat.toPattern(),germanyGermanDecimalFormat.getDecimalFormatSymbols(),germanyGermanCompactPatterns);return customGermanCompactNumberFormat;
}
上面的代码清单中有三项值得特别强调:
-
CompactNumberFormat(String, DecimalFormatSymbols, String[])
构造函数允许将String
数组传递到实例以指定紧凑数字模式。 - 定义紧凑数字模式的
String[]
的性质在Javadoc中的CompactNumberFormat类中定义,该类指出:“紧凑数字模式以一系列模式表示,其中每个模式用于格式化一系列数字。”- 相同的Javadoc提供了一个基于美国语言环境的示例,该示例提供了10 0到10 14范围内的这些值,而我在此处采用的就是该示例。
- 可以提供多于或少于15个样式,但第一个提供的样式始终对应于10 0 。 Javadoc指出:“可以有任意数量的模式,它们严格基于索引,范围从10 0开始 。”
- 为了在此进行演示,我根据对前面引用的subreddit线程的观察来调整了模式。 我对德语了解不多,但是基于SI的后缀的说法很有道理,无论如何这仅出于说明目的。
- 在此示例中,我从JDK提供的针对德国德语语言环境( Locale.GERMANY )的
DecimalFormat
实例中检索了CompactNumberFormat
构造函数的其他两个参数。 这样可以确保我的CompactNumberFormat
自定义德国德语实例的小数模式和十进制格式符号与与JDK提供的实例相关联的十进制模式和十进制格式符号相同。
上面的代码清单显示了对一个名为acquireDecimalFormat(Locale)
的方法的调用,以获取JDK提供的Locale.GERMANY
的DecimalFormat
实例。 为了完整起见,接下来显示该方法。
/*** Provides an instance of {@code DecimalFormat} associated with* the provided instance of {@code Locale}.** @param locale Locale for which an instance of {@code DecimalFormat}* is desired.* @return Instance of {@code DecimalFormat} corresponding to the* provided {@code Locale}.* @throws ClassCastException Thrown if I'm unable to acquire a* {@code DecimalFormat} instance from the static factory method* on class {@code NumberFormat} (the approach recommended in the* class-level Javadoc for {@code DecimalFormat}).*/
private static DecimalFormat acquireDecimalFormat(final Locale locale)
{final NumberFormat generalGermanyGermanFormat= NumberFormat.getInstance(locale);if (generalGermanyGermanFormat instanceof DecimalFormat){return (DecimalFormat) generalGermanyGermanFormat;}throw new ClassCastException("Unable to acquire DecimalFormat in recommended manner;"+ " presented with NumberFormat type of '"+ generalGermanyGermanFormat.getClass().getSimpleName()+ "' instead.");
}
上面显示的代码段演示了当不希望在给定Locale
类的实例中关联的紧凑数字模式时,如何为CompactNumberFormat
的给定实例定制紧凑数字模式。 如果CompactNumberFormat
类上有一个方法可以覆盖与通过NumberFormat
静态工厂类获得的现有实例相关联的一些或所有紧凑型数字模式, 那就很好了 ,但是JDK 12已经进入了下降阶段2 。
翻译自: https://www.javacodegeeks.com/2019/01/number-pattern-compact-number-formatting.html