From 66c49f8887bfe76c17d7077a9c2dc7cb00b36a6e Mon Sep 17 00:00:00 2001 From: Shane Carr Date: Wed, 19 Apr 2017 23:42:18 +0000 Subject: [PATCH] ICU-13115 Reject decimal format patterns that have a trailing ',' X-SVN-Rev: 40068 --- .../test/testdata/numberformattestspecification.txt | 7 +++---- .../src/com/ibm/icu/impl/number/PatternString.java | 11 ++++++++++- .../icu/dev/data/numberformattestspecification.txt | 7 +++---- .../ibm/icu/dev/test/number/PatternStringTest.java | 4 +++- 4 files changed, 19 insertions(+), 10 deletions(-) diff --git a/icu4c/source/test/testdata/numberformattestspecification.txt b/icu4c/source/test/testdata/numberformattestspecification.txt index 5c39853bc41..9858ffe6995 100644 --- a/icu4c/source/test/testdata/numberformattestspecification.txt +++ b/icu4c/source/test/testdata/numberformattestspecification.txt @@ -1534,10 +1534,9 @@ set locale en begin pattern format output breaks $0M 123456 $123456M -// C, J, and K reject the pattern as malformed. -// S accepts it and prints no grouping. -$0,M 123456 $123456M CJK -$0,,M 123456 $123456M CJK +// The following patterns are rejected as malformed. +$0,M 123456 fail +$0,,M 123456 fail test empty negative subpattern // This test is for #13117 diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/PatternString.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/PatternString.java index 7540c890940..c43f4a8df72 100644 --- a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/PatternString.java +++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/PatternString.java @@ -743,6 +743,7 @@ public class PatternString { boolean seenSignificantDigitMarker = false; boolean seenDigit = false; + outer: while (true) { switch (state.peek()) { case ',': @@ -798,10 +799,18 @@ public class PatternString { break; default: - return; + break outer; } state.next(); // consume the symbol } + + // Disallow patterns with a trailing ',' or with two ',' next to each other + if (result.groupingSizes[0] == 0 && result.groupingSizes[1] != -1) { + throw state.toParseException("Trailing grouping separator is invalid"); + } + if (result.groupingSizes[1] == 0 && result.groupingSizes[2] != -1) { + throw state.toParseException("Grouping width of zero is invalid"); + } } private static void consumeFractionFormat(ParserState state, SubpatternParseResult result) { diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/data/numberformattestspecification.txt b/icu4j/main/tests/core/src/com/ibm/icu/dev/data/numberformattestspecification.txt index 5c39853bc41..9858ffe6995 100644 --- a/icu4j/main/tests/core/src/com/ibm/icu/dev/data/numberformattestspecification.txt +++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/data/numberformattestspecification.txt @@ -1534,10 +1534,9 @@ set locale en begin pattern format output breaks $0M 123456 $123456M -// C, J, and K reject the pattern as malformed. -// S accepts it and prints no grouping. -$0,M 123456 $123456M CJK -$0,,M 123456 $123456M CJK +// The following patterns are rejected as malformed. +$0,M 123456 fail +$0,,M 123456 fail test empty negative subpattern // This test is for #13117 diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/PatternStringTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/PatternStringTest.java index 1226ab92de0..b9bf2efe97f 100644 --- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/PatternStringTest.java +++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/PatternStringTest.java @@ -97,7 +97,9 @@ public class PatternStringTest { @Test public void testExceptionOnInvalid() { - String[] invalidPatterns = {"#.#.#", "0#", "0#.", ".#0", "0#.#0", "@0", "0@"}; + String[] invalidPatterns = { + "#.#.#", "0#", "0#.", ".#0", "0#.#0", "@0", "0@", "0,", "0,,", "0,,0", "0,,0," + }; for (String pattern : invalidPatterns) { try { -- 2.40.0