OLD | NEW |
| (Empty) |
1 /* | |
2 ******************************************************************************** | |
3 * Copyright (C) 1997-2010, International Business Machines | |
4 * Corporation and others. All Rights Reserved. | |
5 ******************************************************************************** | |
6 * | |
7 * File DCFMTSYM.H | |
8 * | |
9 * Modification History: | |
10 * | |
11 * Date Name Description | |
12 * 02/19/97 aliu Converted from java. | |
13 * 03/18/97 clhuang Updated per C++ implementation. | |
14 * 03/27/97 helena Updated to pass the simple test after code review. | |
15 * 08/26/97 aliu Added currency/intl currency symbol support. | |
16 * 07/22/98 stephen Changed to match C++ style | |
17 * currencySymbol -> fCurrencySymbol | |
18 * Constants changed from CAPS to kCaps | |
19 * 06/24/99 helena Integrated Alan's NF enhancements and Java2 bug fixe
s | |
20 * 09/22/00 grhoten Marked deprecation tags with a pointer to replacemen
t | |
21 * functions. | |
22 ******************************************************************************** | |
23 */ | |
24 | |
25 #ifndef DCFMTSYM_H | |
26 #define DCFMTSYM_H | |
27 | |
28 #include "unicode/utypes.h" | |
29 #include "unicode/uchar.h" | |
30 | |
31 #if !UCONFIG_NO_FORMATTING | |
32 | |
33 #include "unicode/uobject.h" | |
34 #include "unicode/locid.h" | |
35 | |
36 /** | |
37 * \file | |
38 * \brief C++ API: Symbols for formatting numbers. | |
39 */ | |
40 | |
41 | |
42 U_NAMESPACE_BEGIN | |
43 | |
44 /** | |
45 * This class represents the set of symbols needed by DecimalFormat | |
46 * to format numbers. DecimalFormat creates for itself an instance of | |
47 * DecimalFormatSymbols from its locale data. If you need to change any | |
48 * of these symbols, you can get the DecimalFormatSymbols object from | |
49 * your DecimalFormat and modify it. | |
50 * <P> | |
51 * Here are the special characters used in the parts of the | |
52 * subpattern, with notes on their usage. | |
53 * <pre> | |
54 * \code | |
55 * Symbol Meaning | |
56 * 0 a digit | |
57 * # a digit, zero shows as absent | |
58 * . placeholder for decimal separator | |
59 * , placeholder for grouping separator. | |
60 * ; separates formats. | |
61 * - default negative prefix. | |
62 * % divide by 100 and show as percentage | |
63 * X any other characters can be used in the prefix or suffix | |
64 * ' used to quote special characters in a prefix or suffix. | |
65 * \endcode | |
66 * </pre> | |
67 * [Notes] | |
68 * <P> | |
69 * If there is no explicit negative subpattern, - is prefixed to the | |
70 * positive form. That is, "0.00" alone is equivalent to "0.00;-0.00". | |
71 * <P> | |
72 * The grouping separator is commonly used for thousands, but in some | |
73 * countries for ten-thousands. The interval is a constant number of | |
74 * digits between the grouping characters, such as 100,000,000 or 1,0000,0000. | |
75 * If you supply a pattern with multiple grouping characters, the interval | |
76 * between the last one and the end of the integer is the one that is | |
77 * used. So "#,##,###,####" == "######,####" == "##,####,####". | |
78 * <P> | |
79 * This class only handles localized digits where the 10 digits are | |
80 * contiguous in Unicode, from 0 to 9. Other digits sets (such as | |
81 * superscripts) would need a different subclass. | |
82 */ | |
83 class U_I18N_API DecimalFormatSymbols : public UObject { | |
84 public: | |
85 /** | |
86 * Constants for specifying a number format symbol. | |
87 * @stable ICU 2.0 | |
88 */ | |
89 enum ENumberFormatSymbol { | |
90 /** The decimal separator */ | |
91 kDecimalSeparatorSymbol, | |
92 /** The grouping separator */ | |
93 kGroupingSeparatorSymbol, | |
94 /** The pattern separator */ | |
95 kPatternSeparatorSymbol, | |
96 /** The percent sign */ | |
97 kPercentSymbol, | |
98 /** Zero*/ | |
99 kZeroDigitSymbol, | |
100 /** Character representing a digit in the pattern */ | |
101 kDigitSymbol, | |
102 /** The minus sign */ | |
103 kMinusSignSymbol, | |
104 /** The plus sign */ | |
105 kPlusSignSymbol, | |
106 /** The currency symbol */ | |
107 kCurrencySymbol, | |
108 /** The international currency symbol */ | |
109 kIntlCurrencySymbol, | |
110 /** The monetary separator */ | |
111 kMonetarySeparatorSymbol, | |
112 /** The exponential symbol */ | |
113 kExponentialSymbol, | |
114 /** Per mill symbol - replaces kPermillSymbol */ | |
115 kPerMillSymbol, | |
116 /** Escape padding character */ | |
117 kPadEscapeSymbol, | |
118 /** Infinity symbol */ | |
119 kInfinitySymbol, | |
120 /** Nan symbol */ | |
121 kNaNSymbol, | |
122 /** Significant digit symbol | |
123 * @stable ICU 3.0 */ | |
124 kSignificantDigitSymbol, | |
125 /** The monetary grouping separator | |
126 * @stable ICU 3.6 | |
127 */ | |
128 kMonetaryGroupingSeparatorSymbol, | |
129 /** One | |
130 * @draft ICU 4.6 | |
131 */ | |
132 kOneDigitSymbol, | |
133 /** Two | |
134 * @draft ICU 4.6 | |
135 */ | |
136 kTwoDigitSymbol, | |
137 /** Three | |
138 * @draft ICU 4.6 | |
139 */ | |
140 kThreeDigitSymbol, | |
141 /** Four | |
142 * @draft ICU 4.6 | |
143 */ | |
144 kFourDigitSymbol, | |
145 /** Five | |
146 * @draft ICU 4.6 | |
147 */ | |
148 kFiveDigitSymbol, | |
149 /** Six | |
150 * @draft ICU 4.6 | |
151 */ | |
152 kSixDigitSymbol, | |
153 /** Seven | |
154 * @draft ICU 4.6 | |
155 */ | |
156 kSevenDigitSymbol, | |
157 /** Eight | |
158 * @draft ICU 4.6 | |
159 */ | |
160 kEightDigitSymbol, | |
161 /** Nine | |
162 * @draft ICU 4.6 | |
163 */ | |
164 kNineDigitSymbol, | |
165 /** count symbol constants */ | |
166 kFormatSymbolCount | |
167 }; | |
168 | |
169 /** | |
170 * Constants for specifying currency spacing | |
171 * @draft ICU 4.2 | |
172 */ | |
173 enum ECurrencySpacing { | |
174 kCurrencyMatch, | |
175 kSurroundingMatch, | |
176 kInsert, | |
177 kCurrencySpacingCount | |
178 }; | |
179 | |
180 /** | |
181 * Create a DecimalFormatSymbols object for the given locale. | |
182 * | |
183 * @param locale The locale to get symbols for. | |
184 * @param status Input/output parameter, set to success or | |
185 * failure code upon return. | |
186 * @stable ICU 2.0 | |
187 */ | |
188 DecimalFormatSymbols(const Locale& locale, UErrorCode& status); | |
189 | |
190 /** | |
191 * Create a DecimalFormatSymbols object for the default locale. | |
192 * This constructor will not fail. If the resource file data is | |
193 * not available, it will use hard-coded last-resort data and | |
194 * set status to U_USING_FALLBACK_ERROR. | |
195 * | |
196 * @param status Input/output parameter, set to success or | |
197 * failure code upon return. | |
198 * @stable ICU 2.0 | |
199 */ | |
200 DecimalFormatSymbols( UErrorCode& status); | |
201 | |
202 /** | |
203 * Copy constructor. | |
204 * @stable ICU 2.0 | |
205 */ | |
206 DecimalFormatSymbols(const DecimalFormatSymbols&); | |
207 | |
208 /** | |
209 * Assignment operator. | |
210 * @stable ICU 2.0 | |
211 */ | |
212 DecimalFormatSymbols& operator=(const DecimalFormatSymbols&); | |
213 | |
214 /** | |
215 * Destructor. | |
216 * @stable ICU 2.0 | |
217 */ | |
218 virtual ~DecimalFormatSymbols(); | |
219 | |
220 /** | |
221 * Return true if another object is semantically equal to this one. | |
222 * | |
223 * @param other the object to be compared with. | |
224 * @return true if another object is semantically equal to this one. | |
225 * @stable ICU 2.0 | |
226 */ | |
227 UBool operator==(const DecimalFormatSymbols& other) const; | |
228 | |
229 /** | |
230 * Return true if another object is semantically unequal to this one. | |
231 * | |
232 * @param other the object to be compared with. | |
233 * @return true if another object is semantically unequal to this on
e. | |
234 * @stable ICU 2.0 | |
235 */ | |
236 UBool operator!=(const DecimalFormatSymbols& other) const { return !operator
==(other); } | |
237 | |
238 /** | |
239 * Get one of the format symbols by its enum constant. | |
240 * Each symbol is stored as a string so that graphemes | |
241 * (characters with modifier letters) can be used. | |
242 * | |
243 * @param symbol Constant to indicate a number format symbol. | |
244 * @return the format symbols by the param 'symbol' | |
245 * @stable ICU 2.0 | |
246 */ | |
247 inline UnicodeString getSymbol(ENumberFormatSymbol symbol) const; | |
248 | |
249 /** | |
250 * Set one of the format symbols by its enum constant. | |
251 * Each symbol is stored as a string so that graphemes | |
252 * (characters with modifier letters) can be used. | |
253 * | |
254 * @param symbol Constant to indicate a number format symbol. | |
255 * @param value value of the format symbol | |
256 * @param propogateDigits If false, setting the zero digit will not automati
cally set 1-9. | |
257 * The default behavior is to automatically set 1-9 if zero is being set
and the value | |
258 * it is being set to corresponds to a known Unicode zero digit. | |
259 * @stable ICU 2.0 | |
260 */ | |
261 void setSymbol(ENumberFormatSymbol symbol, const UnicodeString &value, const
UBool propogateDigits); | |
262 | |
263 /** | |
264 * Returns the locale for which this object was constructed. | |
265 * @stable ICU 2.6 | |
266 */ | |
267 inline Locale getLocale() const; | |
268 | |
269 /** | |
270 * Returns the locale for this object. Two flavors are available: | |
271 * valid and actual locale. | |
272 * @stable ICU 2.8 | |
273 */ | |
274 Locale getLocale(ULocDataLocaleType type, UErrorCode& status) const; | |
275 | |
276 /** | |
277 * Get pattern string for 'CurrencySpacing' that can be applied to | |
278 * currency format. | |
279 * This API gets the CurrencySpacing data from ResourceBundle. The pattern
can | |
280 * be empty if there is no data from current locale and its parent locales. | |
281 * | |
282 * @param type : kCurrencyMatch, kSurroundingMatch or kInsert. | |
283 * @param beforeCurrency : true if the pattern is for before currency symbo
l. | |
284 * false if the pattern is for after currency symbo
l. | |
285 * @param status: Input/output parameter, set to success or | |
286 * failure code upon return. | |
287 * @return pattern string for currencyMatch, surroundingMatch or spaceInser
t. | |
288 * Return empty string if there is no data for this locale and its pare
nt | |
289 * locales. | |
290 * @draft ICU 4.2 | |
291 */ | |
292 const UnicodeString& getPatternForCurrencySpacing(ECurrencySpacing type, | |
293 UBool beforeCurrency, | |
294 UErrorCode& status) const; | |
295 /** | |
296 * Set pattern string for 'CurrencySpacing' that can be applied to | |
297 * currency format. | |
298 * | |
299 * @param type : kCurrencyMatch, kSurroundingMatch or kInsert. | |
300 * @param beforeCurrency : true if the pattern is for before currency symb
ol. | |
301 * false if the pattern is for after currency symb
ol. | |
302 * @param pattern : pattern string to override current setting. | |
303 * @draft ICU 4.2 | |
304 */ | |
305 void setPatternForCurrencySpacing(ECurrencySpacing type, | |
306 UBool beforeCurrency, | |
307 const UnicodeString& pattern); | |
308 | |
309 /** | |
310 * ICU "poor man's RTTI", returns a UClassID for the actual class. | |
311 * | |
312 * @stable ICU 2.2 | |
313 */ | |
314 virtual UClassID getDynamicClassID() const; | |
315 | |
316 /** | |
317 * ICU "poor man's RTTI", returns a UClassID for this class. | |
318 * | |
319 * @stable ICU 2.2 | |
320 */ | |
321 static UClassID U_EXPORT2 getStaticClassID(); | |
322 | |
323 private: | |
324 DecimalFormatSymbols(); // default constructor not implemented | |
325 | |
326 /** | |
327 * Initializes the symbols from the LocaleElements resource bundle. | |
328 * Note: The organization of LocaleElements badly needs to be | |
329 * cleaned up. | |
330 * | |
331 * @param locale The locale to get symbols for. | |
332 * @param success Input/output parameter, set to success or | |
333 * failure code upon return. | |
334 * @param useLastResortData determine if use last resort data | |
335 */ | |
336 void initialize(const Locale& locale, UErrorCode& success, UBool useLastReso
rtData = FALSE); | |
337 | |
338 /** | |
339 * Initialize the symbols with default values. | |
340 */ | |
341 void initialize(); | |
342 | |
343 void setCurrencyForSymbols(); | |
344 | |
345 public: | |
346 /** | |
347 * _Internal_ function - more efficient version of getSymbol, | |
348 * returning a const reference to one of the symbol strings. | |
349 * The returned reference becomes invalid when the symbol is changed | |
350 * or when the DecimalFormatSymbols are destroyed. | |
351 * ### TODO markus 2002oct11: Consider proposing getConstSymbol() to be real
ly public. | |
352 * | |
353 * @param symbol Constant to indicate a number format symbol. | |
354 * @return the format symbol by the param 'symbol' | |
355 * @internal | |
356 */ | |
357 inline const UnicodeString &getConstSymbol(ENumberFormatSymbol symbol) const
; | |
358 | |
359 /** | |
360 * Returns that pattern stored in currecy info. Internal API for use by Numb
erFormat API. | |
361 * @internal | |
362 */ | |
363 inline const UChar* getCurrencyPattern(void) const; | |
364 | |
365 private: | |
366 /** | |
367 * Private symbol strings. | |
368 * They are either loaded from a resource bundle or otherwise owned. | |
369 * setSymbol() clones the symbol string. | |
370 * Readonly aliases can only come from a resource bundle, so that we can alw
ays | |
371 * use fastCopyFrom() with them. | |
372 * | |
373 * If DecimalFormatSymbols becomes subclassable and the status of fSymbols c
hanges | |
374 * from private to protected, | |
375 * or when fSymbols can be set any other way that allows them to be readonly
aliases | |
376 * to non-resource bundle strings, | |
377 * then regular UnicodeString copies must be used instead of fastCopyFrom(). | |
378 * | |
379 * @internal | |
380 */ | |
381 UnicodeString fSymbols[kFormatSymbolCount]; | |
382 | |
383 /** | |
384 * Non-symbol variable for getConstSymbol(). Always empty. | |
385 * @internal | |
386 */ | |
387 UnicodeString fNoSymbol; | |
388 | |
389 Locale locale; | |
390 | |
391 char actualLocale[ULOC_FULLNAME_CAPACITY]; | |
392 char validLocale[ULOC_FULLNAME_CAPACITY]; | |
393 const UChar* currPattern; | |
394 | |
395 UnicodeString currencySpcBeforeSym[kCurrencySpacingCount]; | |
396 UnicodeString currencySpcAfterSym[kCurrencySpacingCount]; | |
397 }; | |
398 | |
399 // ------------------------------------- | |
400 | |
401 inline UnicodeString | |
402 DecimalFormatSymbols::getSymbol(ENumberFormatSymbol symbol) const { | |
403 const UnicodeString *strPtr; | |
404 if(symbol < kFormatSymbolCount) { | |
405 strPtr = &fSymbols[symbol]; | |
406 } else { | |
407 strPtr = &fNoSymbol; | |
408 } | |
409 return *strPtr; | |
410 } | |
411 | |
412 inline const UnicodeString & | |
413 DecimalFormatSymbols::getConstSymbol(ENumberFormatSymbol symbol) const { | |
414 const UnicodeString *strPtr; | |
415 if(symbol < kFormatSymbolCount) { | |
416 strPtr = &fSymbols[symbol]; | |
417 } else { | |
418 strPtr = &fNoSymbol; | |
419 } | |
420 return *strPtr; | |
421 } | |
422 | |
423 // ------------------------------------- | |
424 | |
425 inline void | |
426 DecimalFormatSymbols::setSymbol(ENumberFormatSymbol symbol, const UnicodeString
&value, const UBool propogateDigits = TRUE) { | |
427 if(symbol<kFormatSymbolCount) { | |
428 fSymbols[symbol]=value; | |
429 } | |
430 | |
431 // If the zero digit is being set to a known zero digit according to Unicode
, | |
432 // then we automatically set the corresponding 1-9 digits | |
433 if ( propogateDigits && symbol == kZeroDigitSymbol && value.countChar32() ==
1 ) { | |
434 UChar32 sym = value.char32At(0); | |
435 if ( u_charDigitValue(sym) == 0 ) { | |
436 for ( int8_t i = 1 ; i<= 9 ; i++ ) { | |
437 sym++; | |
438 fSymbols[(int)kOneDigitSymbol+i-1] = UnicodeString(sym); | |
439 } | |
440 } | |
441 } | |
442 } | |
443 | |
444 // ------------------------------------- | |
445 | |
446 inline Locale | |
447 DecimalFormatSymbols::getLocale() const { | |
448 return locale; | |
449 } | |
450 | |
451 inline const UChar* | |
452 DecimalFormatSymbols::getCurrencyPattern() const { | |
453 return currPattern; | |
454 } | |
455 U_NAMESPACE_END | |
456 | |
457 #endif /* #if !UCONFIG_NO_FORMATTING */ | |
458 | |
459 #endif // _DCFMTSYM | |
460 //eof | |
OLD | NEW |