Support monetary grouping separator in DecimalFormat/DecimalFormatSymbols

XMLWordPrintable

    • Type: CSR
    • Resolution: Approved
    • Priority: P3
    • 15
    • Component/s: 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.

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

              Created:
              Updated:
              Resolved: