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