jdk安装教程_具有JDK 12精简数字格式的自定义精简数字模式

jdk安装教程

jdk安装教程

帖子“紧凑数字格式出现在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;
}

上面的代码清单中有三项值得特别强调:

  1. CompactNumberFormat(String, DecimalFormatSymbols, String[])构造函数允许将String数组传递到实例以指定紧凑数字模式。
  2. 定义紧凑数字模式String[]的性质在Javadoc中的CompactNumberFormat类中定义,该类指出:“紧凑数字模式以一系列模式表示,其中每个模式都用于格式化一系列数字。”
    • 相同的Javadoc提供了一个基于美国语言环境的示例,该示例提供了10 0到10 14范围内的这些值,而这就是我在此处采用的示例。
    • 可以提供多于或少于15个样式,但是第一个提供的样式始终对应于10 0 。 Javadoc指出:“可以有任意数量的模式,它们严格基于索引,范围从10 0开始。”
    • 为了便于演示,我根据对前面引用的subreddit线程观察来调整了模式。 我对德语了解不多,但是基于SI的后缀的说法很有道理,无论如何这仅出于说明目的。
  3. 在此示例中,我从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

jdk安装教程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值