numparse_validators.cpp (2514B)
1 // © 2018 and later: Unicode, Inc. and others. 2 // License & terms of use: http://www.unicode.org/copyright.html 3 4 #include "unicode/utypes.h" 5 6 #if !UCONFIG_NO_FORMATTING 7 8 // Allow implicit conversion from char16_t* to UnicodeString for this file: 9 // Helpful in toString methods and elsewhere. 10 #define UNISTR_FROM_STRING_EXPLICIT 11 12 #include "numparse_types.h" 13 #include "numparse_validators.h" 14 #include "static_unicode_sets.h" 15 16 using namespace icu; 17 using namespace icu::numparse; 18 using namespace icu::numparse::impl; 19 20 21 void RequireAffixValidator::postProcess(ParsedNumber& result) const { 22 if (result.prefix.isBogus() || result.suffix.isBogus()) { 23 // We saw a prefix or a suffix but not both. Fail the parse. 24 result.flags |= FLAG_FAIL; 25 } 26 } 27 28 UnicodeString RequireAffixValidator::toString() const { 29 return u"<ReqAffix>"; 30 } 31 32 33 void RequireCurrencyValidator::postProcess(ParsedNumber& result) const { 34 if (result.currencyCode[0] == 0) { 35 result.flags |= FLAG_FAIL; 36 } 37 } 38 39 UnicodeString RequireCurrencyValidator::toString() const { 40 return u"<ReqCurrency>"; 41 } 42 43 44 RequireDecimalSeparatorValidator::RequireDecimalSeparatorValidator(bool patternHasDecimalSeparator) 45 : fPatternHasDecimalSeparator(patternHasDecimalSeparator) { 46 } 47 48 void RequireDecimalSeparatorValidator::postProcess(ParsedNumber& result) const { 49 bool parseIsInfNaN = 0 != (result.flags & FLAG_INFINITY) || 0 != (result.flags & FLAG_NAN); 50 bool parseHasDecimalSeparator = 0 != (result.flags & FLAG_HAS_DECIMAL_SEPARATOR); 51 if (!parseIsInfNaN && parseHasDecimalSeparator != fPatternHasDecimalSeparator) { 52 result.flags |= FLAG_FAIL; 53 } 54 } 55 56 UnicodeString RequireDecimalSeparatorValidator::toString() const { 57 return u"<ReqDecimal>"; 58 } 59 60 61 void RequireNumberValidator::postProcess(ParsedNumber& result) const { 62 // Require that a number is matched. 63 if (!result.seenNumber()) { 64 result.flags |= FLAG_FAIL; 65 } 66 } 67 68 UnicodeString RequireNumberValidator::toString() const { 69 return u"<ReqNumber>"; 70 } 71 72 MultiplierParseHandler::MultiplierParseHandler(::icu::number::Scale multiplier) 73 : fMultiplier(std::move(multiplier)) {} 74 75 void MultiplierParseHandler::postProcess(ParsedNumber& result) const { 76 if (!result.quantity.bogus) { 77 fMultiplier.applyReciprocalTo(result.quantity); 78 // NOTE: It is okay if the multiplier was negative. 79 } 80 } 81 82 UnicodeString MultiplierParseHandler::toString() const { 83 return u"<Scale>"; 84 } 85 86 #endif /* #if !UCONFIG_NO_FORMATTING */