// © 2018 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html #include "unicode/utypes.h" #if !UCONFIG_NO_FORMATTING // Allow implicit conversion from char16_t* to UnicodeString for this file: // Helpful in toString methods and elsewhere. #define UNISTR_FROM_STRING_EXPLICIT #include "numparse_types.h" #include "numparse_validators.h" #include "static_unicode_sets.h" using namespace icu; using namespace icu::numparse; using namespace icu::numparse::impl; void RequireAffixValidator::postProcess(ParsedNumber& result) const { if (result.prefix.isBogus() || result.suffix.isBogus()) { // We saw a prefix or a suffix but not both. Fail the parse. result.flags |= FLAG_FAIL; } } UnicodeString RequireAffixValidator::toString() const { return u"<ReqAffix>"; } void RequireCurrencyValidator::postProcess(ParsedNumber& result) const { if (result.currencyCode[0] == 0) { result.flags |= FLAG_FAIL; } } UnicodeString RequireCurrencyValidator::toString() const { return u"<ReqCurrency>"; } RequireDecimalSeparatorValidator::RequireDecimalSeparatorValidator(bool patternHasDecimalSeparator) : fPatternHasDecimalSeparator(patternHasDecimalSeparator) { } void RequireDecimalSeparatorValidator::postProcess(ParsedNumber& result) const { bool parseHasDecimalSeparator = 0 != (result.flags & FLAG_HAS_DECIMAL_SEPARATOR); if (parseHasDecimalSeparator != fPatternHasDecimalSeparator) { result.flags |= FLAG_FAIL; } } UnicodeString RequireDecimalSeparatorValidator::toString() const { return u"<ReqDecimal>"; } void RequireNumberValidator::postProcess(ParsedNumber& result) const { // Require that a number is matched. if (!result.seenNumber()) { result.flags |= FLAG_FAIL; } } UnicodeString RequireNumberValidator::toString() const { return u"<ReqNumber>"; } MultiplierParseHandler::MultiplierParseHandler(::icu::number::Scale multiplier) : fMultiplier(std::move(multiplier)) {} void MultiplierParseHandler::postProcess(ParsedNumber& result) const { if (!result.quantity.bogus) { fMultiplier.applyReciprocalTo(result.quantity); // NOTE: It is okay if the multiplier was negative. } } UnicodeString MultiplierParseHandler::toString() const { return u"<Scale>"; } #endif /* #if !UCONFIG_NO_FORMATTING */