< prev index next >

src/java.base/share/classes/java/time/format/DateTimeFormatter.java

Print this page
rev 47925 : 8191349: Add a new method in j.t.f.DateTimeFormatter to reflect Unicode extensions
Reviewed-by:

@@ -128,16 +128,11 @@
  * Chronology, ZoneId, and DecimalStyle.
  * <p>
  * The {@link #withLocale withLocale} method returns a new formatter that
  * overrides the locale. The locale affects some aspects of formatting and
  * parsing. For example, the {@link #ofLocalizedDate ofLocalizedDate} provides a
- * formatter that uses the locale specific date format. If the locale contains
- * "ca" (calendar), "rg" (region override) and/or "tz" (timezone)
- * <a href="../../util/Locale.html#def_locale_extension">Unicode extensions</a>,
- * the chronology and/or the zone are also overridden. If both "ca" and "rg" are
- * specified, the chronology from the "ca" extension supersedes the implicit one
- * from the "rg" extension.
+ * formatter that uses the locale specific date format.
  * <p>
  * The {@link #withChronology withChronology} method returns a new formatter
  * that overrides the chronology. If overridden, the date-time value is
  * converted to the chronology before formatting. During parsing the date-time
  * value is converted to the chronology before it is returned.

@@ -552,17 +547,12 @@
      * <a href="#patterns">pattern of letters and symbols</a>
      * as described in the class documentation.
      * For example, {@code d MMM uuuu} will format 2011-12-03 as '3 Dec 2011'.
      * <p>
      * The formatter will use the {@link Locale#getDefault(Locale.Category) default FORMAT locale}.
-     * This can be changed using {@link DateTimeFormatter#withLocale(Locale)} on the returned formatter.
+     * This can be changed using {@link DateTimeFormatter#withLocale(Locale)} on the returned formatter
      * Alternatively use the {@link #ofPattern(String, Locale)} variant of this method.
-     * If the default locale contains "ca" (calendar), "rg" (region override) and/or "tz" (timezone)
-     * <a href="../../util/Locale.html#def_locale_extension">Unicode extensions</a>,
-     * the chronology and/or the zone are overridden. If both "ca" and "rg" are
-     * specified, the chronology from the "ca" extension supersedes the implicit one
-     * from the "rg" extension.
      * <p>
      * The returned formatter has no override chronology or zone.
      * It uses {@link ResolverStyle#SMART SMART} resolver style.
      *
      * @param pattern  the pattern to use, not null

@@ -581,16 +571,11 @@
      * <a href="#patterns">pattern of letters and symbols</a>
      * as described in the class documentation.
      * For example, {@code d MMM uuuu} will format 2011-12-03 as '3 Dec 2011'.
      * <p>
      * The formatter will use the specified locale.
-     * This can be changed using {@link DateTimeFormatter#withLocale(Locale)} on the returned formatter.
-     * If the specified locale contains "ca" (calendar), "rg" (region override) and/or "tz" (timezone)
-     * <a href="../../util/Locale.html#def_locale_extension">Unicode extensions</a>,
-     * the chronology and/or the zone are overridden. If both "ca" and "rg" are
-     * specified, the chronology from the "ca" extension supersedes the implicit one
-     * from the "rg" extension.
+     * This can be changed using {@link DateTimeFormatter#withLocale(Locale)} on the returned formatter
      * <p>
      * The returned formatter has no override chronology or zone.
      * It uses {@link ResolverStyle#SMART SMART} resolver style.
      *
      * @param pattern  the pattern to use, not null

@@ -1455,38 +1440,77 @@
 
     /**
      * Returns a copy of this formatter with a new locale.
      * <p>
      * This is used to lookup any part of the formatter needing specific
-     * localization, such as the text or localized pattern. If the new
-     * locale contains "ca" (calendar), "rg" (region override) and/or "tz" (timezone)
-     * <a href="../../util/Locale.html#def_locale_extension">Unicode extensions</a>,
-     * the chronology and/or the zone are also overridden. If both "ca" and "rg" are
-     * specified, the chronology from the "ca" extension supersedes the implicit one
-     * from the "rg" extension.
+     * localization, such as the text or localized pattern.
+     * <p>
+     * The locale is stored as passed in, without further processing.
+     * If the locale has unicode extensions, they may be used later in text
+     * processing. To set the chronology, time-zone and decimal style from
+     * unicode extensions, see {@link #localizedBy localizedBy()}.
      * <p>
      * This instance is immutable and unaffected by this method call.
      *
      * @param locale  the new locale, not null
      * @return a formatter based on this formatter with the requested locale, not null
+     * @see #localizedBy(Locale)
      */
     public DateTimeFormatter withLocale(Locale locale) {
         if (this.locale.equals(locale)) {
             return this;
         }
+        return new DateTimeFormatter(printerParser, locale, decimalStyle, resolverStyle, resolverFields, chrono, zone);
+    }
+
+    /**
+     * Returns a copy of this formatter with localized values of the locale,
+     * calendar, region, decimal style and/or timezone, that supercede values in
+     * this formatter.
+     * <p>
+     * This is used to lookup any part of the formatter needing specific
+     * localization, such as the text or localized pattern. If the locale contains the
+     * "ca" (calendar), "nu" (numbering system), "rg" (region override), and/or
+     * "tz" (timezone)
+     * <a href="../../util/Locale.html#def_locale_extension">Unicode extensions</a>,
+     * the chronology, numbering system and/or the zone are overridden. If both "ca"
+     * and "rg" are specified, the chronology from the "ca" extension supersedes the
+     * implicit one from the "rg" extension. Same is true for the "nu" extension.
+     * <p>
+     * Unlike the {@link #withLocale withLocale} method, the call to this method may
+     * produce a different formatter depending on the order of method chaining with 
+     * other withXXXX() methods.
+     * <p>
+     * This instance is immutable and unaffected by this method call.
+     *
+     * @param locale  the locale, not null
+     * @return a formatter based on this formatter with localized values of
+     *      the calendar, decimal style and/or timezone, that supercede values in this
+     *      formatter.
+     * @see #withLocale(Locale)
+     * @since 10
+     */
+    public DateTimeFormatter localizedBy(Locale locale) {
+        if (this.locale.equals(locale)) {
+            return this;
+        }
 
-        // Check for chronology/timezone in locale object
+        // Check for decimalStyle/chronology/timezone in locale object
         Chronology c = locale.getUnicodeLocaleType("ca") != null ?
                        Chronology.ofLocale(locale) : chrono;
+        DecimalStyle ds = locale.getUnicodeLocaleType("nu") != null ?
+                       DecimalStyle.of(locale) : decimalStyle;
         String tzType = locale.getUnicodeLocaleType("tz");
         ZoneId z  = tzType != null ?
                     TimeZoneNameUtility.convertLDMLShortID(tzType)
                         .map(ZoneId::of)
                         .orElse(zone) :
                     zone;
-        return new DateTimeFormatter(printerParser, locale, decimalStyle,
-                        resolverStyle, resolverFields, c, z);
+        return withLocale(locale)
+              .withChronology(c)
+              .withDecimalStyle(ds)
+              .withZone(z);
     }
 
     //-----------------------------------------------------------------------
     /**
      * Gets the DecimalStyle to be used during formatting.
< prev index next >