summaryrefslogtreecommitdiff
path: root/icu4j/main/classes/core
diff options
context:
space:
mode:
Diffstat (limited to 'icu4j/main/classes/core')
-rw-r--r--icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/FlagHandler.java28
-rw-r--r--icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/NumberParserImpl.java22
2 files changed, 47 insertions, 3 deletions
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/FlagHandler.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/FlagHandler.java
new file mode 100644
index 000000000..37d39113a
--- /dev/null
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/FlagHandler.java
@@ -0,0 +1,28 @@
+// © 2018 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html#License
+package com.ibm.icu.impl.number.parse;
+
+/**
+ * Unconditionally applies a given set of flags to the ParsedNumber in the post-processing step.
+ */
+public class FlagHandler extends ValidationMatcher {
+
+ public static final FlagHandler PERCENT = new FlagHandler(ParsedNumber.FLAG_PERCENT);
+ public static final FlagHandler PERMILLE = new FlagHandler(ParsedNumber.FLAG_PERMILLE);
+
+ private final int flags;
+
+ private FlagHandler(int flags) {
+ this.flags = flags;
+ }
+
+ @Override
+ public void postProcess(ParsedNumber result) {
+ result.flags |= flags;
+ }
+
+ @Override
+ public String toString() {
+ return "<FlagsHandler " + Integer.toHexString(flags) + ">";
+ }
+}
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/NumberParserImpl.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/NumberParserImpl.java
index 36fc84041..a614a3bbc 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/NumberParserImpl.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/parse/NumberParserImpl.java
@@ -10,6 +10,7 @@ import java.util.List;
import com.ibm.icu.impl.StringSegment;
import com.ibm.icu.impl.number.AffixPatternProvider;
+import com.ibm.icu.impl.number.AffixUtils;
import com.ibm.icu.impl.number.CustomSymbolCurrency;
import com.ibm.icu.impl.number.DecimalFormatProperties;
import com.ibm.icu.impl.number.Grouper;
@@ -247,6 +248,23 @@ public class NumberParserImpl {
parser.addMatcher(CurrencyTrieMatcher.getInstance(locale));
}
+ ///////////////
+ /// PERCENT ///
+ ///////////////
+
+ // ICU-TC meeting, April 11, 2018: accept percent/permille only if it is in the pattern,
+ // and to maintain regressive behavior, divide by 100 even if no percent sign is present.
+ if (patternInfo.containsSymbolType(AffixUtils.TYPE_PERCENT)) {
+ parser.addMatcher(PercentMatcher.getInstance(symbols));
+ // causes number to be always scaled by 100:
+ parser.addMatcher(FlagHandler.PERCENT);
+ }
+ if (patternInfo.containsSymbolType(AffixUtils.TYPE_PERMILLE)) {
+ parser.addMatcher(PermilleMatcher.getInstance(symbols));
+ // causes number to be always scaled by 1000:
+ parser.addMatcher(FlagHandler.PERMILLE);
+ }
+
///////////////////////////////
/// OTHER STANDARD MATCHERS ///
///////////////////////////////
@@ -254,10 +272,8 @@ public class NumberParserImpl {
if (!isStrict) {
parser.addMatcher(PlusSignMatcher.getInstance(symbols, false));
parser.addMatcher(MinusSignMatcher.getInstance(symbols, false));
- parser.addMatcher(NanMatcher.getInstance(symbols, parseFlags));
- parser.addMatcher(PercentMatcher.getInstance(symbols));
- parser.addMatcher(PermilleMatcher.getInstance(symbols));
}
+ parser.addMatcher(NanMatcher.getInstance(symbols, parseFlags));
parser.addMatcher(InfinityMatcher.getInstance(symbols));
String padString = properties.getPadString();
if (padString != null && !ignorables.getSet().contains(padString)) {