From d7c424b00f89ad2cb6734b106964ed72a3390415 Mon Sep 17 00:00:00 2001 From: "Shane F. Carr" Date: Fri, 24 Jun 2022 18:00:14 -0700 Subject: [PATCH] ICU-22073 Do not throw away CompactDecimalFormat's affixes --- icu4c/source/i18n/number_formatimpl.cpp | 4 +++- icu4c/source/i18n/number_mapper.cpp | 2 -- .../core/src/com/ibm/icu/number/NumberFormatterImpl.java | 4 +++- .../core/src/com/ibm/icu/number/NumberPropertyMapper.java | 2 -- .../ibm/icu/dev/test/format/CompactDecimalFormatTest.java | 5 ++++- 5 files changed, 10 insertions(+), 7 deletions(-) diff --git a/icu4c/source/i18n/number_formatimpl.cpp b/icu4c/source/i18n/number_formatimpl.cpp index 96e3e9e7c69..4fb190b744b 100644 --- a/icu4c/source/i18n/number_formatimpl.cpp +++ b/icu4c/source/i18n/number_formatimpl.cpp @@ -353,7 +353,9 @@ NumberFormatterImpl::macrosToMicroGenerator(const MacroProps& macros, bool safe, } fPatternModifier.adoptInstead(patternModifier); const AffixPatternProvider* affixProvider = - macros.affixProvider != nullptr + macros.affixProvider != nullptr && ( + // For more information on this condition, see ICU-22073 + !isCompactNotation || isCurrency == macros.affixProvider->hasCurrencySign()) ? macros.affixProvider : static_cast(fPatternInfo.getAlias()); patternModifier->setPatternInfo(affixProvider, kUndefinedField); diff --git a/icu4c/source/i18n/number_mapper.cpp b/icu4c/source/i18n/number_mapper.cpp index 350c431dfdd..2f398d4a939 100644 --- a/icu4c/source/i18n/number_mapper.cpp +++ b/icu4c/source/i18n/number_mapper.cpp @@ -256,8 +256,6 @@ MacroProps NumberPropertyMapper::oldToNew(const DecimalFormatProperties& propert } else { macros.notation = Notation::compactShort(); } - // Do not forward the affix provider. - macros.affixProvider = nullptr; } ///////////////// diff --git a/icu4j/main/classes/core/src/com/ibm/icu/number/NumberFormatterImpl.java b/icu4j/main/classes/core/src/com/ibm/icu/number/NumberFormatterImpl.java index 365dfc783c2..238a64f27b1 100644 --- a/icu4j/main/classes/core/src/com/ibm/icu/number/NumberFormatterImpl.java +++ b/icu4j/main/classes/core/src/com/ibm/icu/number/NumberFormatterImpl.java @@ -363,7 +363,9 @@ class NumberFormatterImpl { // The default middle modifier is weak (thus the false argument). MutablePatternModifier patternMod = new MutablePatternModifier(false); AffixPatternProvider affixProvider = - (macros.affixProvider != null) + (macros.affixProvider != null && ( + // For more information on this condition, see ICU-22073 + !isCompactNotation || isCurrency == macros.affixProvider.hasCurrencySign())) ? macros.affixProvider : patternInfo; patternMod.setPatternInfo(affixProvider, null); diff --git a/icu4j/main/classes/core/src/com/ibm/icu/number/NumberPropertyMapper.java b/icu4j/main/classes/core/src/com/ibm/icu/number/NumberPropertyMapper.java index 2ed5f1c2bc4..6adbda4847d 100644 --- a/icu4j/main/classes/core/src/com/ibm/icu/number/NumberPropertyMapper.java +++ b/icu4j/main/classes/core/src/com/ibm/icu/number/NumberPropertyMapper.java @@ -301,8 +301,6 @@ final class NumberPropertyMapper { } else { macros.notation = Notation.compactShort(); } - // Do not forward the affix provider. - macros.affixProvider = null; } ///////////////// diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/CompactDecimalFormatTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/CompactDecimalFormatTest.java index 6a714048811..93712d186e5 100644 --- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/CompactDecimalFormatTest.java +++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/CompactDecimalFormatTest.java @@ -30,6 +30,7 @@ import org.junit.runners.JUnit4; import com.ibm.icu.dev.test.TestFmwk; import com.ibm.icu.impl.number.DecimalFormatProperties; +import com.ibm.icu.impl.number.PatternStringParser; import com.ibm.icu.text.CompactDecimalFormat; import com.ibm.icu.text.CompactDecimalFormat.CompactStyle; import com.ibm.icu.text.DecimalFormat; @@ -669,10 +670,12 @@ public class CompactDecimalFormatTest extends TestFmwk { cdf.setProperties(new PropertySetter() { @Override public void set(DecimalFormatProperties props) { + PatternStringParser.parseToExistingProperties( + "0 foo", props, PatternStringParser.IGNORE_ROUNDING_ALWAYS); props.setCompactCustomData(customData); } }); - assertEquals("Below custom range", "123", cdf.format(123)); + assertEquals("Below custom range", "123 foo", cdf.format(123)); assertEquals("Plural form one", "1 qwerty", cdf.format(1000)); assertEquals("Plural form other", "1.2 dvorak", cdf.format(1234)); assertEquals("Above custom range", "12 dvorak", cdf.format(12345)); -- 2.40.0