From: Shane F. Carr Date: Fri, 21 Sep 2018 22:19:16 +0000 (-0700) Subject: ICU-11276 Apply the approximately pattern inside of the unit string. (#148) X-Git-Tag: release-63-rc~21 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5cfb733249ceb044314293cd3fe5e076412a5a68;p=icu ICU-11276 Apply the approximately pattern inside of the unit string. (#148) --- diff --git a/icu4c/source/i18n/numrange_impl.cpp b/icu4c/source/i18n/numrange_impl.cpp index 19b8b10321f..21365bfc59b 100644 --- a/icu4c/source/i18n/numrange_impl.cpp +++ b/icu4c/source/i18n/numrange_impl.cpp @@ -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); } diff --git a/icu4c/source/test/intltest/numbertest_range.cpp b/icu4c/source/test/intltest/numbertest_range.cpp index 30f033d059c..b19a76da7a6 100644 --- a/icu4c/source/test/intltest/numbertest_range.cpp +++ b/icu4c/source/test/intltest/numbertest_range.cpp @@ -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() { diff --git a/icu4j/main/classes/core/src/com/ibm/icu/number/NumberRangeFormatterImpl.java b/icu4j/main/classes/core/src/com/ibm/icu/number/NumberRangeFormatterImpl.java index 71aafe51cd1..7f709bd6373 100644 --- a/icu4j/main/classes/core/src/com/ibm/icu/number/NumberRangeFormatterImpl.java +++ b/icu4j/main/classes/core/src/com/ibm/icu/number/NumberRangeFormatterImpl.java @@ -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); } diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/NumberRangeFormatterTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/NumberRangeFormatterTest.java index 52933d0b271..88bac0b01f1 100644 --- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/NumberRangeFormatterTest.java +++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/NumberRangeFormatterTest.java @@ -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