Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8235942

Support monetary grouping separator in DecimalFormat/DecimalFormatSymbols

XMLWordPrintable

    • Icon: CSR CSR
    • Resolution: Approved
    • Icon: P3 P3
    • 15
    • core-libs
    • None
    • source, behavioral
    • low
    • Existing applications that set their custom grouping separator for currency formating with DecimalFormatSymbols.setGroupingSeparator() will not see the effect.
    • Java API
    • SE

      Summary

      Grouping separator in java.text.DecimalFormat/DecimalFormatSymbols should identify generic and monetary instances.

      Problem

      Some languages have two distinct characters for the grouping separator. For example, the number 1_500 should be formatted to "1 500" as a generic number, and "1.500" for currency in German in Austria. Currently, JDK assumes there is one single character for the grouping separator per locale, so it cannot handle the de-AT case.

      Solution

      A monetary grouping separator is added to DecimalFormatSymbols. It is used in DecimalFormat for patterns with a currency sign symbol U+00A4. Public get and set methods should be provided for applications, which will be on par with get/setMonetaryDecimalSeparator() methods. Initial values for the field will be obtained from the CLDR locale data.

      Specification

      In java.text.DecimalFormat class description, change the following rows in the chart of "Special Pattern Characters":

      The "Meaning" column of ',' should read:

      Grouping separator or monetary grouping separator

      The "Meaning" column of ¤ (\u00A4) should read:

      Currency sign, replaced by currency symbol. If doubled, replaced by international currency symbol. If present in a pattern, the monetary decimal/grouping separators are used instead of the decimal/grouping separators.

      Add the following new getter/setter methods in java.text.DecimalFormatSymbols class:

      /**
       * Gets the character used for grouping separator for currencies.
       * May be different from {@code grouping separator} in some locales,
       * e.g, German in Austria.
       *
       * @since 15
       * @return the monetary grouping separator
       */
      public char getMonetaryGroupingSeparator()
      
       /**
       * Sets the character used for grouping separator for currencies.
       * Invocation of this method will not affect the normal
       * {@code grouping separator}.
       *
       * @param monetaryGroupingSeparator the monetary grouping separator
       * @see #setGroupingSeparator(char)
       * @since 15
       */
      public void setMonetaryGroupingSeparator(char monetaryGroupingSeparator)

      Add the following new serializable field in java.text.DecimalFormatSymbols class:

      /**
       * The grouping separator used when formatting currency values.
       *
       * @serial
       * @since 15
       */
      private  char    monetaryGroupingSeparator;

      Add the following sentence in the method description of java.text.DecimalFormatSymbols.readObject(), after the perMillText, percentText, minusSignText explanation :

       * If {@code serialVersionOnStream} is less than 5, it initializes
       * {@code monetaryGroupingSeparator} using {@code groupingSeparator}.

      Add the following list item in the field description of java.text.DecimalFormatSymbols.serialVersionOnStream, after the perMillText, percentText, minusSignText list item:

       * <li><b>5</b>: Versions written by Java SE 15 or later, which include
       *      new {@code monetaryGroupingSeparator} field.

      Replace the occurrences of "thousand separator(s)" with "grouping separator(s)" in DecimalFormat and DecimalFormatSymbols classes, as the former is old (and incorrect) usage of the separator name.

            naoto Naoto Sato
            webbuggrp Webbug Group
            Roger Riggs
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

              Created:
              Updated:
              Resolved: