]> granicus.if.org Git - icu/commitdiff
ICU-11276 Apply the approximately pattern inside of the unit string. (#148)
authorShane F. Carr <shane@unicode.org>
Fri, 21 Sep 2018 22:19:16 +0000 (15:19 -0700)
committerShane Carr <shane@unicode.org>
Thu, 27 Sep 2018 21:27:41 +0000 (14:27 -0700)
icu4c/source/i18n/numrange_impl.cpp
icu4c/source/test/intltest/numbertest_range.cpp
icu4j/main/classes/core/src/com/ibm/icu/number/NumberRangeFormatterImpl.java
icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/NumberRangeFormatterTest.java

index 19b8b10321f8be93c5bc5ecee5a19a2ecc46648c..21365bfc59bca358564b31fba3456f821466cb06 100644 (file)
@@ -294,8 +294,11 @@ void NumberRangeFormatterImpl::formatApproximately (UFormattedNumberRangeData& d
     if (U_FAILURE(status)) { return; }
     if (fSameFormatters) {
         int32_t length = NumberFormatterImpl::writeNumber(micros1, data.quantity1, data.string, 0, status);
-        length += NumberFormatterImpl::writeAffixes(micros1, data.string, 0, length, status);
-        fApproximatelyModifier.apply(data.string, 0, length, status);
+        // HEURISTIC: Desired modifier order: inner, middle, approximately, outer.
+        length += micros1.modInner->apply(data.string, 0, length, status);
+        length += micros1.modMiddle->apply(data.string, 0, length, status);
+        length += fApproximatelyModifier.apply(data.string, 0, length, status);
+        micros1.modOuter->apply(data.string, 0, length, status);
     } else {
         formatRange(data, micros1, micros2, status);
     }
index 30f033d059c86758804d803a14b893c1daf3017c..b19a76da7a626e75c77bc53d7be48a2b641de7f9 100644 (file)
@@ -593,7 +593,7 @@ void NumberRangeFormatterTest::testIdentity() {
         u"5,000–5,000,000");
 
     assertFormatRange(
-        u"Identity fallback  Single Value",
+        u"Identity fallback Single Value",
         NumberRangeFormatter::with().identityFallback(UNUM_IDENTITY_FALLBACK_SINGLE_VALUE),
         Locale("en-us"),
         u"1–5",
@@ -623,6 +623,22 @@ void NumberRangeFormatterTest::testIdentity() {
         u"~5K",
         u"5K",
         u"5K – 5M");
+
+    assertFormatRange(
+        u"Approximately in middle of unit string",
+        NumberRangeFormatter::with().numberFormatterBoth(
+            NumberFormatter::with().unit(FAHRENHEIT).unitWidth(UNUM_UNIT_WIDTH_FULL_NAME)),
+        Locale("zh-Hant"),
+        u"華氏 1-5 度",
+        u"華氏 ~5 度",
+        u"華氏 ~5 度",
+        u"華氏 0-3 度",
+        u"華氏 ~0 度",
+        u"華氏 3-3,000 度",
+        u"華氏 3,000-5,000 度",
+        u"華氏 4,999-5,001 度",
+        u"華氏 ~5,000 度",
+        u"華氏 5,000-5,000,000 度");
 }
 
 void NumberRangeFormatterTest::testDifferentFormatters() {
index 71aafe51cd1e8174e4ca5a1c85db6051e7e75694..7f709bd63737e63e56f92624b890c75471673858 100644 (file)
@@ -208,8 +208,11 @@ class NumberRangeFormatterImpl {
             MicroProps micros1, MicroProps micros2) {
         if (fSameFormatters) {
             int length = NumberFormatterImpl.writeNumber(micros1, quantity1, string, 0);
-            length += NumberFormatterImpl.writeAffixes(micros1, string, 0, length);
-            fApproximatelyModifier.apply(string, 0, length);
+            // HEURISTIC: Desired modifier order: inner, middle, approximately, outer.
+            length += micros1.modInner.apply(string, 0, length);
+            length += micros1.modMiddle.apply(string, 0, length);
+            length += fApproximatelyModifier.apply(string, 0, length);
+            micros1.modOuter.apply(string, 0, length);
         } else {
             formatRange(quantity1, quantity2, string, micros1, micros2);
         }
index 52933d0b271524cb9bb62c812ece646e53e03422..88bac0b01f1d7f12fcb2670ce9a3ec54052754ea 100644 (file)
@@ -612,6 +612,22 @@ public class NumberRangeFormatterTest {
             "~5K",
             "5K",
             "5K – 5M");
+
+        assertFormatRange(
+            "Approximately in middle of unit string",
+            NumberRangeFormatter.with().numberFormatterBoth(
+                NumberFormatter.with().unit(MeasureUnit.FAHRENHEIT).unitWidth(UnitWidth.FULL_NAME)),
+            new ULocale("zh-Hant"),
+            "華氏 1-5 度",
+            "華氏 ~5 度",
+            "華氏 ~5 度",
+            "華氏 0-3 度",
+            "華氏 ~0 度",
+            "華氏 3-3,000 度",
+            "華氏 3,000-5,000 度",
+            "華氏 4,999-5,001 度",
+            "華氏 ~5,000 度",
+            "華氏 5,000-5,000,000 度");
     }
 
     @Test