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 postProcess(ParsedNumber & result) const21void 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 toString() const28UnicodeString RequireAffixValidator::toString() const { 29 return u"<ReqAffix>"; 30 } 31 32 postProcess(ParsedNumber & result) const33void RequireCurrencyValidator::postProcess(ParsedNumber& result) const { 34 if (result.currencyCode[0] == 0) { 35 result.flags |= FLAG_FAIL; 36 } 37 } 38 toString() const39UnicodeString RequireCurrencyValidator::toString() const { 40 return u"<ReqCurrency>"; 41 } 42 43 RequireDecimalSeparatorValidator(bool patternHasDecimalSeparator)44RequireDecimalSeparatorValidator::RequireDecimalSeparatorValidator(bool patternHasDecimalSeparator) 45 : fPatternHasDecimalSeparator(patternHasDecimalSeparator) { 46 } 47 postProcess(ParsedNumber & result) const48void RequireDecimalSeparatorValidator::postProcess(ParsedNumber& result) const { 49 bool parseHasDecimalSeparator = 0 != (result.flags & FLAG_HAS_DECIMAL_SEPARATOR); 50 if (parseHasDecimalSeparator != fPatternHasDecimalSeparator) { 51 result.flags |= FLAG_FAIL; 52 } 53 } 54 toString() const55UnicodeString RequireDecimalSeparatorValidator::toString() const { 56 return u"<ReqDecimal>"; 57 } 58 59 postProcess(ParsedNumber & result) const60void RequireNumberValidator::postProcess(ParsedNumber& result) const { 61 // Require that a number is matched. 62 if (!result.seenNumber()) { 63 result.flags |= FLAG_FAIL; 64 } 65 } 66 toString() const67UnicodeString RequireNumberValidator::toString() const { 68 return u"<ReqNumber>"; 69 } 70 MultiplierParseHandler(::icu::number::Scale multiplier)71MultiplierParseHandler::MultiplierParseHandler(::icu::number::Scale multiplier) 72 : fMultiplier(std::move(multiplier)) {} 73 postProcess(ParsedNumber & result) const74void MultiplierParseHandler::postProcess(ParsedNumber& result) const { 75 if (!result.quantity.bogus) { 76 fMultiplier.applyReciprocalTo(result.quantity); 77 // NOTE: It is okay if the multiplier was negative. 78 } 79 } 80 toString() const81UnicodeString MultiplierParseHandler::toString() const { 82 return u"<Scale>"; 83 } 84 85 #endif /* #if !UCONFIG_NO_FORMATTING */ 86