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