1 // © 2018 and later: Unicode, Inc. and others.
2 // License & terms of use: http://www.unicode.org/copyright.html
4 #include "unicode/utypes.h"
6 #if !UCONFIG_NO_FORMATTING
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
12 #include "numparse_types.h"
13 #include "numparse_validators.h"
14 #include "static_unicode_sets.h"
17 using namespace icu::numparse
;
18 using namespace icu::numparse::impl
;
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
;
28 UnicodeString
RequireAffixValidator::toString() const {
33 void RequireCurrencyValidator::postProcess(ParsedNumber
& result
) const {
34 if (result
.currencyCode
[0] == 0) {
35 result
.flags
|= FLAG_FAIL
;
39 UnicodeString
RequireCurrencyValidator::toString() const {
40 return u
"<ReqCurrency>";
44 RequireDecimalSeparatorValidator::RequireDecimalSeparatorValidator(bool patternHasDecimalSeparator
)
45 : fPatternHasDecimalSeparator(patternHasDecimalSeparator
) {
48 void RequireDecimalSeparatorValidator::postProcess(ParsedNumber
& result
) const {
49 bool parseHasDecimalSeparator
= 0 != (result
.flags
& FLAG_HAS_DECIMAL_SEPARATOR
);
50 if (parseHasDecimalSeparator
!= fPatternHasDecimalSeparator
) {
51 result
.flags
|= FLAG_FAIL
;
55 UnicodeString
RequireDecimalSeparatorValidator::toString() const {
56 return u
"<ReqDecimal>";
60 void RequireNumberValidator::postProcess(ParsedNumber
& result
) const {
61 // Require that a number is matched.
62 if (!result
.seenNumber()) {
63 result
.flags
|= FLAG_FAIL
;
67 UnicodeString
RequireNumberValidator::toString() const {
68 return u
"<ReqNumber>";
71 MultiplierParseHandler::MultiplierParseHandler(::icu::number::Scale multiplier
)
72 : fMultiplier(std::move(multiplier
)) {}
74 void 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.
81 UnicodeString
MultiplierParseHandler::toString() const {
85 #endif /* #if !UCONFIG_NO_FORMATTING */