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 | #ifndef __NUMPARSE_CURRENCY_H__ |
8 | #define __NUMPARSE_CURRENCY_H__ |
9 | |
10 | #include "numparse_types.h" |
11 | #include "numparse_compositions.h" |
12 | #include "charstr.h" |
13 | #include "number_currencysymbols.h" |
14 | #include "unicode/uniset.h" |
15 | |
16 | U_NAMESPACE_BEGIN namespace numparse { |
17 | namespace impl { |
18 | |
19 | using ::icu::number::impl::CurrencySymbols; |
20 | |
21 | /** |
22 | * Matches a currency, either a custom currency or one from the data bundle. The class is called |
23 | * "combined" to emphasize that the currency string may come from one of multiple sources. |
24 | * |
25 | * Will match currency spacing either before or after the number depending on whether we are currently in |
26 | * the prefix or suffix. |
27 | * |
28 | * The implementation of this class is slightly different between J and C. See #13584 for a follow-up. |
29 | * |
30 | * @author sffc |
31 | */ |
32 | // Exported as U_I18N_API for tests |
33 | class U_I18N_API CombinedCurrencyMatcher : public NumberParseMatcher, public UMemory { |
34 | public: |
35 | CombinedCurrencyMatcher() = default; // WARNING: Leaves the object in an unusable state |
36 | |
37 | CombinedCurrencyMatcher(const CurrencySymbols& currencySymbols, const DecimalFormatSymbols& dfs, |
38 | parse_flags_t parseFlags, UErrorCode& status); |
39 | |
40 | bool match(StringSegment& segment, ParsedNumber& result, UErrorCode& status) const override; |
41 | |
42 | bool smokeTest(const StringSegment& segment) const override; |
43 | |
44 | UnicodeString toString() const override; |
45 | |
46 | private: |
47 | UChar fCurrencyCode[4]; |
48 | UnicodeString fCurrency1; |
49 | UnicodeString fCurrency2; |
50 | |
51 | bool fUseFullCurrencyData; |
52 | UnicodeString fLocalLongNames[StandardPlural::COUNT]; |
53 | |
54 | UnicodeString afterPrefixInsert; |
55 | UnicodeString beforeSuffixInsert; |
56 | |
57 | // We could use Locale instead of CharString here, but |
58 | // Locale has a non-trivial default constructor. |
59 | CharString fLocaleName; |
60 | |
61 | // TODO: See comments in constructor in numparse_currency.cpp |
62 | // UnicodeSet fLeadCodePoints; |
63 | |
64 | /** Matches the currency string without concern for currency spacing. */ |
65 | bool matchCurrency(StringSegment& segment, ParsedNumber& result, UErrorCode& status) const; |
66 | }; |
67 | |
68 | |
69 | } // namespace impl |
70 | } // namespace numparse |
71 | U_NAMESPACE_END |
72 | |
73 | #endif //__NUMPARSE_CURRENCY_H__ |
74 | #endif /* #if !UCONFIG_NO_FORMATTING */ |
75 | |