<i18n dev> JDK-8042131: Proposal of Mapped-values formatter for non-IsoChronology

Toshio 5 Nakamura TOSHIONA at jp.ibm.com
Fri Jun 15 09:10:14 UTC 2018


Hello core-libs and i18n folks,

We'd like to request to reconsider JDK-8042131,
"DateTimeFormatterBuilder Mapped-values do not work for JapaneseDate".
The report was posted by our team long time ago, and was closed as not an
issue.
At that time, the feature was for only IsoChronology.

Now, I found the attached patch can activate the mapped-values formatter
for
non-IsoChronology.

Additionally, the Japanese new era will be expected in May 2019. The first
year of
each era has a special expression in Japanese, "U+5143 U+5e74" (Gannen).
java.util.JapaneseImperialCalendar uses this expression.
We'd like to use the expression with JapaneseChronology by mapped-values
formatter as an option.

Can we have a sponsor of this proposal?

--sample usage of Japanese new era--
DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder();
Map<Long, String> yearMap = new HashMap<>();
yearMap.put(1L, "\u5143");
builder.appendText(ChronoField.ERA, TextStyle.FULL)
            .appendText(ChronoField.YEAR_OF_ERA, yearMap)
            .appendLiteral("\u5e74");
---------------

Report:
https://bugs.openjdk.java.net/browse/JDK-8042131

Patch:
--- old/src/java.base/share/classes/java/time/format/DateTimeFormatterBuilder.java	2018-06-15 17:39:11.489303979 +0900
+++ new/src/java.base/share/classes/java/time/format/DateTimeFormatterBuilder.java	2018-06-15 17:39:11.157303972 +0900
@@ -793,6 +793,11 @@
         final LocaleStore store = new LocaleStore(map);
         DateTimeTextProvider provider = new DateTimeTextProvider() {
             @Override
+            public String getText(Chronology chrono, TemporalField field,
+                                  long value, TextStyle style, Locale locale) {
+                return store.getText(value, style);
+            }
+            @Override
             public String getText(TemporalField field, long value, TextStyle style, Locale locale) {
                 return store.getText(value, style);
             }
--- old/test/jdk/java/time/test/java/time/format/TestDateTimeFormatterBuilderWithLocale.java	2018-06-15 17:39:12.664304007 +0900
+++ new/test/jdk/java/time/test/java/time/format/TestDateTimeFormatterBuilderWithLocale.java	2018-06-15 17:39:12.298303999 +0900
@@ -67,14 +67,21 @@
 import java.time.chrono.Chronology;
 import java.time.chrono.IsoChronology;
 import java.time.chrono.JapaneseChronology;
+import java.time.chrono.JapaneseEra;
 import java.time.chrono.MinguoChronology;
+import java.time.chrono.ThaiBuddhistChronology;
+import java.time.chrono.ChronoLocalDate;
 import java.time.format.DateTimeFormatter;
 import java.time.format.DateTimeFormatterBuilder;
 import java.time.format.FormatStyle;
 import java.time.LocalDate;
 import java.time.temporal.Temporal;
+import java.time.temporal.ChronoField;
+import static java.time.temporal.ChronoUnit.YEARS;

 import java.util.Locale;
+import java.util.Map;
+import java.util.HashMap;

 import static org.testng.Assert.assertEquals;

@@ -115,6 +122,31 @@
     }

     //-----------------------------------------------------------------------
+    @DataProvider(name="mappedPatterns")
+    Object[][] localizedMappedPatterns() {
+        return new Object[][] {
+            {IsoChronology.INSTANCE.date(1,1,1), Locale.ENGLISH},
+            {JapaneseChronology.INSTANCE.date(JapaneseEra.HEISEI,
+                                              1,1,8), Locale.ENGLISH},
+            {MinguoChronology.INSTANCE.date(1,1,1), Locale.ENGLISH},
+            {ThaiBuddhistChronology.INSTANCE.date(1,1,1), Locale.ENGLISH},
+        };
+    }
+
+    @Test(dataProvider="mappedPatterns")
+    public void test_getLocalizedMappedPattern(ChronoLocalDate date, Locale locale) {
+        final String new1st = "1st";
+        Map<Long, String> yearMap = new HashMap<>();
+        yearMap.put(1L, new1st);
+        DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder();
+        builder.appendText(ChronoField.YEAR_OF_ERA, yearMap);
+
+        String actual = date.format(builder.toFormatter(locale));
+        assertEquals(actual, new1st);
+    }
+
+
+    //-----------------------------------------------------------------------
     @DataProvider(name="localePatterns")
     Object[][] localizedDateTimePatterns() {
         return new Object[][] {

---
Best regards,
Toshio Nakamura, IBM Japan


More information about the i18n-dev mailing list