1*0e209d39SAndroid Build Coastguard Worker // © 2016 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 ******************************************************************************* 5*0e209d39SAndroid Build Coastguard Worker * Copyright (C) 2009-2015, International Business Machines Corporation and * 6*0e209d39SAndroid Build Coastguard Worker * others. All Rights Reserved. * 7*0e209d39SAndroid Build Coastguard Worker ******************************************************************************* 8*0e209d39SAndroid Build Coastguard Worker */ 9*0e209d39SAndroid Build Coastguard Worker #ifndef CURRPINF_H 10*0e209d39SAndroid Build Coastguard Worker #define CURRPINF_H 11*0e209d39SAndroid Build Coastguard Worker 12*0e209d39SAndroid Build Coastguard Worker #include "unicode/utypes.h" 13*0e209d39SAndroid Build Coastguard Worker 14*0e209d39SAndroid Build Coastguard Worker #if U_SHOW_CPLUSPLUS_API 15*0e209d39SAndroid Build Coastguard Worker 16*0e209d39SAndroid Build Coastguard Worker /** 17*0e209d39SAndroid Build Coastguard Worker * \file 18*0e209d39SAndroid Build Coastguard Worker * \brief C++ API: Currency Plural Information used by Decimal Format 19*0e209d39SAndroid Build Coastguard Worker */ 20*0e209d39SAndroid Build Coastguard Worker 21*0e209d39SAndroid Build Coastguard Worker #if !UCONFIG_NO_FORMATTING 22*0e209d39SAndroid Build Coastguard Worker 23*0e209d39SAndroid Build Coastguard Worker #include "unicode/unistr.h" 24*0e209d39SAndroid Build Coastguard Worker 25*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_BEGIN 26*0e209d39SAndroid Build Coastguard Worker 27*0e209d39SAndroid Build Coastguard Worker class Locale; 28*0e209d39SAndroid Build Coastguard Worker class PluralRules; 29*0e209d39SAndroid Build Coastguard Worker class Hashtable; 30*0e209d39SAndroid Build Coastguard Worker 31*0e209d39SAndroid Build Coastguard Worker /** 32*0e209d39SAndroid Build Coastguard Worker * This class represents the information needed by 33*0e209d39SAndroid Build Coastguard Worker * DecimalFormat to format currency plural, 34*0e209d39SAndroid Build Coastguard Worker * such as "3.00 US dollars" or "1.00 US dollar". 35*0e209d39SAndroid Build Coastguard Worker * DecimalFormat creates for itself an instance of 36*0e209d39SAndroid Build Coastguard Worker * CurrencyPluralInfo from its locale data. 37*0e209d39SAndroid Build Coastguard Worker * If you need to change any of these symbols, you can get the 38*0e209d39SAndroid Build Coastguard Worker * CurrencyPluralInfo object from your 39*0e209d39SAndroid Build Coastguard Worker * DecimalFormat and modify it. 40*0e209d39SAndroid Build Coastguard Worker * 41*0e209d39SAndroid Build Coastguard Worker * Following are the information needed for currency plural format and parse: 42*0e209d39SAndroid Build Coastguard Worker * locale information, 43*0e209d39SAndroid Build Coastguard Worker * plural rule of the locale, 44*0e209d39SAndroid Build Coastguard Worker * currency plural pattern of the locale. 45*0e209d39SAndroid Build Coastguard Worker * 46*0e209d39SAndroid Build Coastguard Worker * @stable ICU 4.2 47*0e209d39SAndroid Build Coastguard Worker */ 48*0e209d39SAndroid Build Coastguard Worker class U_I18N_API CurrencyPluralInfo : public UObject { 49*0e209d39SAndroid Build Coastguard Worker public: 50*0e209d39SAndroid Build Coastguard Worker 51*0e209d39SAndroid Build Coastguard Worker /** 52*0e209d39SAndroid Build Coastguard Worker * Create a CurrencyPluralInfo object for the default locale. 53*0e209d39SAndroid Build Coastguard Worker * @param status output param set to success/failure code on exit 54*0e209d39SAndroid Build Coastguard Worker * @stable ICU 4.2 55*0e209d39SAndroid Build Coastguard Worker */ 56*0e209d39SAndroid Build Coastguard Worker CurrencyPluralInfo(UErrorCode& status); 57*0e209d39SAndroid Build Coastguard Worker 58*0e209d39SAndroid Build Coastguard Worker /** 59*0e209d39SAndroid Build Coastguard Worker * Create a CurrencyPluralInfo object for the given locale. 60*0e209d39SAndroid Build Coastguard Worker * @param locale the locale 61*0e209d39SAndroid Build Coastguard Worker * @param status output param set to success/failure code on exit 62*0e209d39SAndroid Build Coastguard Worker * @stable ICU 4.2 63*0e209d39SAndroid Build Coastguard Worker */ 64*0e209d39SAndroid Build Coastguard Worker CurrencyPluralInfo(const Locale& locale, UErrorCode& status); 65*0e209d39SAndroid Build Coastguard Worker 66*0e209d39SAndroid Build Coastguard Worker /** 67*0e209d39SAndroid Build Coastguard Worker * Copy constructor 68*0e209d39SAndroid Build Coastguard Worker * 69*0e209d39SAndroid Build Coastguard Worker * @stable ICU 4.2 70*0e209d39SAndroid Build Coastguard Worker */ 71*0e209d39SAndroid Build Coastguard Worker CurrencyPluralInfo(const CurrencyPluralInfo& info); 72*0e209d39SAndroid Build Coastguard Worker 73*0e209d39SAndroid Build Coastguard Worker 74*0e209d39SAndroid Build Coastguard Worker /** 75*0e209d39SAndroid Build Coastguard Worker * Assignment operator 76*0e209d39SAndroid Build Coastguard Worker * 77*0e209d39SAndroid Build Coastguard Worker * @stable ICU 4.2 78*0e209d39SAndroid Build Coastguard Worker */ 79*0e209d39SAndroid Build Coastguard Worker CurrencyPluralInfo& operator=(const CurrencyPluralInfo& info); 80*0e209d39SAndroid Build Coastguard Worker 81*0e209d39SAndroid Build Coastguard Worker 82*0e209d39SAndroid Build Coastguard Worker /** 83*0e209d39SAndroid Build Coastguard Worker * Destructor 84*0e209d39SAndroid Build Coastguard Worker * 85*0e209d39SAndroid Build Coastguard Worker * @stable ICU 4.2 86*0e209d39SAndroid Build Coastguard Worker */ 87*0e209d39SAndroid Build Coastguard Worker virtual ~CurrencyPluralInfo(); 88*0e209d39SAndroid Build Coastguard Worker 89*0e209d39SAndroid Build Coastguard Worker 90*0e209d39SAndroid Build Coastguard Worker /** 91*0e209d39SAndroid Build Coastguard Worker * Equal operator. 92*0e209d39SAndroid Build Coastguard Worker * 93*0e209d39SAndroid Build Coastguard Worker * @stable ICU 4.2 94*0e209d39SAndroid Build Coastguard Worker */ 95*0e209d39SAndroid Build Coastguard Worker bool operator==(const CurrencyPluralInfo& info) const; 96*0e209d39SAndroid Build Coastguard Worker 97*0e209d39SAndroid Build Coastguard Worker 98*0e209d39SAndroid Build Coastguard Worker /** 99*0e209d39SAndroid Build Coastguard Worker * Not equal operator 100*0e209d39SAndroid Build Coastguard Worker * 101*0e209d39SAndroid Build Coastguard Worker * @stable ICU 4.2 102*0e209d39SAndroid Build Coastguard Worker */ 103*0e209d39SAndroid Build Coastguard Worker bool operator!=(const CurrencyPluralInfo& info) const; 104*0e209d39SAndroid Build Coastguard Worker 105*0e209d39SAndroid Build Coastguard Worker 106*0e209d39SAndroid Build Coastguard Worker /** 107*0e209d39SAndroid Build Coastguard Worker * Clone 108*0e209d39SAndroid Build Coastguard Worker * 109*0e209d39SAndroid Build Coastguard Worker * @stable ICU 4.2 110*0e209d39SAndroid Build Coastguard Worker */ 111*0e209d39SAndroid Build Coastguard Worker CurrencyPluralInfo* clone() const; 112*0e209d39SAndroid Build Coastguard Worker 113*0e209d39SAndroid Build Coastguard Worker 114*0e209d39SAndroid Build Coastguard Worker /** 115*0e209d39SAndroid Build Coastguard Worker * Gets plural rules of this locale, used for currency plural format 116*0e209d39SAndroid Build Coastguard Worker * 117*0e209d39SAndroid Build Coastguard Worker * @return plural rule 118*0e209d39SAndroid Build Coastguard Worker * @stable ICU 4.2 119*0e209d39SAndroid Build Coastguard Worker */ 120*0e209d39SAndroid Build Coastguard Worker const PluralRules* getPluralRules() const; 121*0e209d39SAndroid Build Coastguard Worker 122*0e209d39SAndroid Build Coastguard Worker /** 123*0e209d39SAndroid Build Coastguard Worker * Given a plural count, gets currency plural pattern of this locale, 124*0e209d39SAndroid Build Coastguard Worker * used for currency plural format 125*0e209d39SAndroid Build Coastguard Worker * 126*0e209d39SAndroid Build Coastguard Worker * @param pluralCount currency plural count 127*0e209d39SAndroid Build Coastguard Worker * @param result output param to receive the pattern 128*0e209d39SAndroid Build Coastguard Worker * @return a currency plural pattern based on plural count 129*0e209d39SAndroid Build Coastguard Worker * @stable ICU 4.2 130*0e209d39SAndroid Build Coastguard Worker */ 131*0e209d39SAndroid Build Coastguard Worker UnicodeString& getCurrencyPluralPattern(const UnicodeString& pluralCount, 132*0e209d39SAndroid Build Coastguard Worker UnicodeString& result) const; 133*0e209d39SAndroid Build Coastguard Worker 134*0e209d39SAndroid Build Coastguard Worker /** 135*0e209d39SAndroid Build Coastguard Worker * Get locale 136*0e209d39SAndroid Build Coastguard Worker * 137*0e209d39SAndroid Build Coastguard Worker * @return locale 138*0e209d39SAndroid Build Coastguard Worker * @stable ICU 4.2 139*0e209d39SAndroid Build Coastguard Worker */ 140*0e209d39SAndroid Build Coastguard Worker const Locale& getLocale() const; 141*0e209d39SAndroid Build Coastguard Worker 142*0e209d39SAndroid Build Coastguard Worker /** 143*0e209d39SAndroid Build Coastguard Worker * Set plural rules. 144*0e209d39SAndroid Build Coastguard Worker * The plural rule is set when CurrencyPluralInfo 145*0e209d39SAndroid Build Coastguard Worker * instance is created. 146*0e209d39SAndroid Build Coastguard Worker * You can call this method to reset plural rules only if you want 147*0e209d39SAndroid Build Coastguard Worker * to modify the default plural rule of the locale. 148*0e209d39SAndroid Build Coastguard Worker * 149*0e209d39SAndroid Build Coastguard Worker * @param ruleDescription new plural rule description 150*0e209d39SAndroid Build Coastguard Worker * @param status output param set to success/failure code on exit 151*0e209d39SAndroid Build Coastguard Worker * @stable ICU 4.2 152*0e209d39SAndroid Build Coastguard Worker */ 153*0e209d39SAndroid Build Coastguard Worker void setPluralRules(const UnicodeString& ruleDescription, 154*0e209d39SAndroid Build Coastguard Worker UErrorCode& status); 155*0e209d39SAndroid Build Coastguard Worker 156*0e209d39SAndroid Build Coastguard Worker /** 157*0e209d39SAndroid Build Coastguard Worker * Set currency plural pattern. 158*0e209d39SAndroid Build Coastguard Worker * The currency plural pattern is set when CurrencyPluralInfo 159*0e209d39SAndroid Build Coastguard Worker * instance is created. 160*0e209d39SAndroid Build Coastguard Worker * You can call this method to reset currency plural pattern only if 161*0e209d39SAndroid Build Coastguard Worker * you want to modify the default currency plural pattern of the locale. 162*0e209d39SAndroid Build Coastguard Worker * 163*0e209d39SAndroid Build Coastguard Worker * @param pluralCount the plural count for which the currency pattern will 164*0e209d39SAndroid Build Coastguard Worker * be overridden. 165*0e209d39SAndroid Build Coastguard Worker * @param pattern the new currency plural pattern 166*0e209d39SAndroid Build Coastguard Worker * @param status output param set to success/failure code on exit 167*0e209d39SAndroid Build Coastguard Worker * @stable ICU 4.2 168*0e209d39SAndroid Build Coastguard Worker */ 169*0e209d39SAndroid Build Coastguard Worker void setCurrencyPluralPattern(const UnicodeString& pluralCount, 170*0e209d39SAndroid Build Coastguard Worker const UnicodeString& pattern, 171*0e209d39SAndroid Build Coastguard Worker UErrorCode& status); 172*0e209d39SAndroid Build Coastguard Worker 173*0e209d39SAndroid Build Coastguard Worker /** 174*0e209d39SAndroid Build Coastguard Worker * Set locale 175*0e209d39SAndroid Build Coastguard Worker * 176*0e209d39SAndroid Build Coastguard Worker * @param loc the new locale to set 177*0e209d39SAndroid Build Coastguard Worker * @param status output param set to success/failure code on exit 178*0e209d39SAndroid Build Coastguard Worker * @stable ICU 4.2 179*0e209d39SAndroid Build Coastguard Worker */ 180*0e209d39SAndroid Build Coastguard Worker void setLocale(const Locale& loc, UErrorCode& status); 181*0e209d39SAndroid Build Coastguard Worker 182*0e209d39SAndroid Build Coastguard Worker /** 183*0e209d39SAndroid Build Coastguard Worker * ICU "poor man's RTTI", returns a UClassID for the actual class. 184*0e209d39SAndroid Build Coastguard Worker * 185*0e209d39SAndroid Build Coastguard Worker * @stable ICU 4.2 186*0e209d39SAndroid Build Coastguard Worker */ 187*0e209d39SAndroid Build Coastguard Worker virtual UClassID getDynamicClassID() const override; 188*0e209d39SAndroid Build Coastguard Worker 189*0e209d39SAndroid Build Coastguard Worker /** 190*0e209d39SAndroid Build Coastguard Worker * ICU "poor man's RTTI", returns a UClassID for this class. 191*0e209d39SAndroid Build Coastguard Worker * 192*0e209d39SAndroid Build Coastguard Worker * @stable ICU 4.2 193*0e209d39SAndroid Build Coastguard Worker */ 194*0e209d39SAndroid Build Coastguard Worker static UClassID U_EXPORT2 getStaticClassID(); 195*0e209d39SAndroid Build Coastguard Worker 196*0e209d39SAndroid Build Coastguard Worker private: 197*0e209d39SAndroid Build Coastguard Worker friend class DecimalFormat; 198*0e209d39SAndroid Build Coastguard Worker friend class DecimalFormatImpl; 199*0e209d39SAndroid Build Coastguard Worker 200*0e209d39SAndroid Build Coastguard Worker void initialize(const Locale& loc, UErrorCode& status); 201*0e209d39SAndroid Build Coastguard Worker 202*0e209d39SAndroid Build Coastguard Worker void setupCurrencyPluralPattern(const Locale& loc, UErrorCode& status); 203*0e209d39SAndroid Build Coastguard Worker 204*0e209d39SAndroid Build Coastguard Worker /* 205*0e209d39SAndroid Build Coastguard Worker * delete hash table 206*0e209d39SAndroid Build Coastguard Worker * 207*0e209d39SAndroid Build Coastguard Worker * @param hTable hash table to be deleted 208*0e209d39SAndroid Build Coastguard Worker */ 209*0e209d39SAndroid Build Coastguard Worker void deleteHash(Hashtable* hTable); 210*0e209d39SAndroid Build Coastguard Worker 211*0e209d39SAndroid Build Coastguard Worker 212*0e209d39SAndroid Build Coastguard Worker /* 213*0e209d39SAndroid Build Coastguard Worker * initialize hash table 214*0e209d39SAndroid Build Coastguard Worker * 215*0e209d39SAndroid Build Coastguard Worker * @param status output param set to success/failure code on exit 216*0e209d39SAndroid Build Coastguard Worker * @return hash table initialized 217*0e209d39SAndroid Build Coastguard Worker */ 218*0e209d39SAndroid Build Coastguard Worker Hashtable* initHash(UErrorCode& status); 219*0e209d39SAndroid Build Coastguard Worker 220*0e209d39SAndroid Build Coastguard Worker 221*0e209d39SAndroid Build Coastguard Worker 222*0e209d39SAndroid Build Coastguard Worker /** 223*0e209d39SAndroid Build Coastguard Worker * copy hash table 224*0e209d39SAndroid Build Coastguard Worker * 225*0e209d39SAndroid Build Coastguard Worker * @param source the source to copy from 226*0e209d39SAndroid Build Coastguard Worker * @param target the target to copy to 227*0e209d39SAndroid Build Coastguard Worker * @param status error code 228*0e209d39SAndroid Build Coastguard Worker */ 229*0e209d39SAndroid Build Coastguard Worker void copyHash(const Hashtable* source, Hashtable* target, UErrorCode& status); 230*0e209d39SAndroid Build Coastguard Worker 231*0e209d39SAndroid Build Coastguard Worker //-------------------- private data member --------------------- 232*0e209d39SAndroid Build Coastguard Worker // map from plural count to currency plural pattern, for example 233*0e209d39SAndroid Build Coastguard Worker // a plural pattern defined in "CurrencyUnitPatterns" is 234*0e209d39SAndroid Build Coastguard Worker // "one{{0} {1}}", in which "one" is a plural count 235*0e209d39SAndroid Build Coastguard Worker // and "{0} {1}" is a currency plural pattern". 236*0e209d39SAndroid Build Coastguard Worker // The currency plural pattern saved in this mapping is the pattern 237*0e209d39SAndroid Build Coastguard Worker // defined in "CurrencyUnitPattern" by replacing 238*0e209d39SAndroid Build Coastguard Worker // {0} with the number format pattern, 239*0e209d39SAndroid Build Coastguard Worker // and {1} with 3 currency sign. 240*0e209d39SAndroid Build Coastguard Worker Hashtable* fPluralCountToCurrencyUnitPattern; 241*0e209d39SAndroid Build Coastguard Worker 242*0e209d39SAndroid Build Coastguard Worker /* 243*0e209d39SAndroid Build Coastguard Worker * The plural rule is used to format currency plural name, 244*0e209d39SAndroid Build Coastguard Worker * for example: "3.00 US Dollars". 245*0e209d39SAndroid Build Coastguard Worker * If there are 3 currency signs in the currency pattern, 246*0e209d39SAndroid Build Coastguard Worker * the 3 currency signs will be replaced by currency plural name. 247*0e209d39SAndroid Build Coastguard Worker */ 248*0e209d39SAndroid Build Coastguard Worker PluralRules* fPluralRules; 249*0e209d39SAndroid Build Coastguard Worker 250*0e209d39SAndroid Build Coastguard Worker // locale 251*0e209d39SAndroid Build Coastguard Worker Locale* fLocale; 252*0e209d39SAndroid Build Coastguard Worker 253*0e209d39SAndroid Build Coastguard Worker private: 254*0e209d39SAndroid Build Coastguard Worker /** 255*0e209d39SAndroid Build Coastguard Worker * An internal status variable used to indicate that the object is in an 'invalid' state. 256*0e209d39SAndroid Build Coastguard Worker * Used by copy constructor, the assignment operator and the clone method. 257*0e209d39SAndroid Build Coastguard Worker */ 258*0e209d39SAndroid Build Coastguard Worker UErrorCode fInternalStatus; 259*0e209d39SAndroid Build Coastguard Worker }; 260*0e209d39SAndroid Build Coastguard Worker 261*0e209d39SAndroid Build Coastguard Worker 262*0e209d39SAndroid Build Coastguard Worker inline bool 263*0e209d39SAndroid Build Coastguard Worker CurrencyPluralInfo::operator!=(const CurrencyPluralInfo& info) const { 264*0e209d39SAndroid Build Coastguard Worker return !operator==(info); 265*0e209d39SAndroid Build Coastguard Worker } 266*0e209d39SAndroid Build Coastguard Worker 267*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_END 268*0e209d39SAndroid Build Coastguard Worker 269*0e209d39SAndroid Build Coastguard Worker #endif /* #if !UCONFIG_NO_FORMATTING */ 270*0e209d39SAndroid Build Coastguard Worker 271*0e209d39SAndroid Build Coastguard Worker #endif /* U_SHOW_CPLUSPLUS_API */ 272*0e209d39SAndroid Build Coastguard Worker 273*0e209d39SAndroid Build Coastguard Worker #endif // _CURRPINFO 274*0e209d39SAndroid Build Coastguard Worker //eof 275