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