From cfd99f3f3f309fc224a43377395085bea58b58cb Mon Sep 17 00:00:00 2001 From: Peter Edberg Date: Thu, 8 Sep 2022 22:39:29 -0700 Subject: [PATCH] ICU-22143 Increase COMPACT_MAX_DIGITS from 15 to 20, needed for new ja data --- icu4c/source/i18n/number_compact.cpp | 3 ++- icu4c/source/i18n/number_compact.h | 2 +- icu4c/source/test/intltest/compactdecimalformattest.cpp | 7 ++++++- .../core/src/com/ibm/icu/impl/number/CompactData.java | 2 +- .../ibm/icu/dev/test/format/CompactDecimalFormatTest.java | 5 +++++ 5 files changed, 15 insertions(+), 4 deletions(-) diff --git a/icu4c/source/i18n/number_compact.cpp b/icu4c/source/i18n/number_compact.cpp index 8b9dbc166d4..4dc96e7ea1b 100644 --- a/icu4c/source/i18n/number_compact.cpp +++ b/icu4c/source/i18n/number_compact.cpp @@ -176,7 +176,8 @@ void CompactData::CompactDataSink::put(const char *key, ResourceValue &value, UB // length of the key minus one. We only support magnitudes less than COMPACT_MAX_DIGITS; // ignore entries that have greater magnitude. auto magnitude = static_cast (strlen(key) - 1); - if (magnitude >= COMPACT_MAX_DIGITS) { + U_ASSERT(magnitude < COMPACT_MAX_DIGITS); // debug assert + if (magnitude >= COMPACT_MAX_DIGITS) { // skip in production continue; } int8_t multiplier = data.multipliers[magnitude]; diff --git a/icu4c/source/i18n/number_compact.h b/icu4c/source/i18n/number_compact.h index 9802b9fb10e..fa29744c103 100644 --- a/icu4c/source/i18n/number_compact.h +++ b/icu4c/source/i18n/number_compact.h @@ -17,7 +17,7 @@ U_NAMESPACE_BEGIN namespace number { namespace impl { -static const int32_t COMPACT_MAX_DIGITS = 15; +static const int32_t COMPACT_MAX_DIGITS = 20; class CompactData : public MultiplierProducer { public: diff --git a/icu4c/source/test/intltest/compactdecimalformattest.cpp b/icu4c/source/test/intltest/compactdecimalformattest.cpp index 483b89114c9..eddc45daa32 100644 --- a/icu4c/source/test/intltest/compactdecimalformattest.cpp +++ b/icu4c/source/test/intltest/compactdecimalformattest.cpp @@ -114,7 +114,12 @@ static ExpectedResult kJapaneseShort[] = { {1.23456789E11, "1200\\u5104"}, {1.23456789E12, "1.2\\u5146"}, {1.23456789E13, "12\\u5146"}, - {1.23456789E14, "120\\u5146"}}; + {1.23456789E14, "120\\u5146"}, + {1.23456789E15, "1200\\u5146"}, + {1.23456789E16, "1.2\\u4EAC"}, + {1.23456789E17, "12\\u4EAC"}, + {1.23456789E18, "120\\u4EAC"}, + {1.23456789E19, "1200\\u4EAC"}}; static ExpectedResult kSwahiliShort[] = { {1234.0, "elfu\\u00a01.2"}, diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/CompactData.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/CompactData.java index 87d60f851b1..566f614faf9 100644 --- a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/CompactData.java +++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/CompactData.java @@ -34,7 +34,7 @@ public class CompactData implements MultiplierProducer { private byte largestMagnitude; private boolean isEmpty; - private static final int COMPACT_MAX_DIGITS = 15; + private static final int COMPACT_MAX_DIGITS = 20; public CompactData() { patterns = new String[(CompactData.COMPACT_MAX_DIGITS + 1) * StandardPlural.COUNT]; 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 93712d186e5..a0c344dfaba 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 @@ -148,6 +148,11 @@ public class CompactDecimalFormatTest extends TestFmwk { {1234567890123f, "1.2兆"}, {12345678901234f, "12兆"}, {123456789012345f, "120兆"}, + {1234567890123456f, "1200兆"}, + {12345678901234567f, "1.2京"}, + {123456789012345678f, "12京"}, + {1234567890123456789f, "120京"}, + {12345678901234567890f, "1200京"}, }; Object[][] ChineseTestData = {