• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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