]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/i18n/numparse_compositions.cpp
ICU-64260.0.1.tar.gz
[apple/icu.git] / icuSources / i18n / numparse_compositions.cpp
index 19253da805f0bfce3c6401d6c6de6fd7d1a5c3ce..9d8674f3d0dbc85c3d1941d743aaaea25147f809 100644 (file)
@@ -25,15 +25,18 @@ bool SeriesMatcher::match(StringSegment& segment, ParsedNumber& result, UErrorCo
     bool maybeMore = true;
     for (auto* it = begin(); it < end();) {
         const NumberParseMatcher* matcher = *it;
+        bool startCurrencyIsEmpty = (result.currencyCode[0]==0); // Apple fix for <rdar://problem/46915356>
         int matcherOffset = segment.getOffset();
-        if (segment.length() != 0) {
+        if (segment.length() != 0
+                || (startCurrencyIsEmpty && result.seenNumber())) { // Apple <rdar://problem/51938595>
             maybeMore = matcher->match(segment, result, status);
         } else {
             // Nothing for this matcher to match; ask for more.
             maybeMore = true;
         }
 
-        bool success = (segment.getOffset() != matcherOffset);
+        bool addedCurrency = (startCurrencyIsEmpty && result.currencyCode[0]!=0); // Apple <rdar://problem/51938595>
+        bool success = ((segment.getOffset() != matcherOffset) || addedCurrency); // Apple fix for <rdar://problem/46915356>
         bool isFlexible = matcher->isFlexible();
         if (success && isFlexible) {
             // Match succeeded, and this is a flexible matcher. Re-run it.
@@ -42,7 +45,7 @@ bool SeriesMatcher::match(StringSegment& segment, ParsedNumber& result, UErrorCo
             it++;
             // Small hack: if there is another matcher coming, do not accept trailing weak chars.
             // Needed for proper handling of currency spacing.
-            if (it < end() && segment.getOffset() != result.charEnd && result.charEnd > matcherOffset) {
+            if (it < end() && segment.getOffset() != result.charEnd && (result.charEnd > matcherOffset || addedCurrency)) { // Apple <rdar://problem/51938595>
                 segment.setOffset(result.charEnd);
             }
         } else if (isFlexible) {