Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef DCFMTSYM_H
00026 #define DCFMTSYM_H
00027
00028 #include "unicode/utypes.h"
00029 #include "unicode/uchar.h"
00030
00031 #if !UCONFIG_NO_FORMATTING
00032
00033 #include "unicode/uobject.h"
00034 #include "unicode/locid.h"
00035
00042 U_NAMESPACE_BEGIN
00043
00083 class U_I18N_API DecimalFormatSymbols : public UObject {
00084 public:
00089 enum ENumberFormatSymbol {
00091 kDecimalSeparatorSymbol,
00093 kGroupingSeparatorSymbol,
00095 kPatternSeparatorSymbol,
00097 kPercentSymbol,
00099 kZeroDigitSymbol,
00101 kDigitSymbol,
00103 kMinusSignSymbol,
00105 kPlusSignSymbol,
00107 kCurrencySymbol,
00109 kIntlCurrencySymbol,
00111 kMonetarySeparatorSymbol,
00113 kExponentialSymbol,
00115 kPerMillSymbol,
00117 kPadEscapeSymbol,
00119 kInfinitySymbol,
00121 kNaNSymbol,
00124 kSignificantDigitSymbol,
00128 kMonetaryGroupingSeparatorSymbol,
00132 kOneDigitSymbol,
00136 kTwoDigitSymbol,
00140 kThreeDigitSymbol,
00144 kFourDigitSymbol,
00148 kFiveDigitSymbol,
00152 kSixDigitSymbol,
00156 kSevenDigitSymbol,
00160 kEightDigitSymbol,
00164 kNineDigitSymbol,
00166 kFormatSymbolCount
00167 };
00168
00173 enum ECurrencySpacing {
00174 kCurrencyMatch,
00175 kSurroundingMatch,
00176 kInsert,
00177 kCurrencySpacingCount
00178 };
00179
00188 DecimalFormatSymbols(const Locale& locale, UErrorCode& status);
00189
00200 DecimalFormatSymbols( UErrorCode& status);
00201
00206 DecimalFormatSymbols(const DecimalFormatSymbols&);
00207
00212 DecimalFormatSymbols& operator=(const DecimalFormatSymbols&);
00213
00218 virtual ~DecimalFormatSymbols();
00219
00227 UBool operator==(const DecimalFormatSymbols& other) const;
00228
00236 UBool operator!=(const DecimalFormatSymbols& other) const { return !operator==(other); }
00237
00247 inline UnicodeString getSymbol(ENumberFormatSymbol symbol) const;
00248
00261 void setSymbol(ENumberFormatSymbol symbol, const UnicodeString &value, const UBool propogateDigits);
00262
00267 inline Locale getLocale() const;
00268
00274 Locale getLocale(ULocDataLocaleType type, UErrorCode& status) const;
00275
00292 const UnicodeString& getPatternForCurrencySpacing(ECurrencySpacing type,
00293 UBool beforeCurrency,
00294 UErrorCode& status) const;
00305 void setPatternForCurrencySpacing(ECurrencySpacing type,
00306 UBool beforeCurrency,
00307 const UnicodeString& pattern);
00308
00314 virtual UClassID getDynamicClassID() const;
00315
00321 static UClassID U_EXPORT2 getStaticClassID();
00322
00323 private:
00324 DecimalFormatSymbols();
00325
00336 void initialize(const Locale& locale, UErrorCode& success, UBool useLastResortData = FALSE);
00337
00341 void initialize();
00342
00343 void setCurrencyForSymbols();
00344
00345 public:
00357 inline const UnicodeString &getConstSymbol(ENumberFormatSymbol symbol) const;
00358
00363 inline const UChar* getCurrencyPattern(void) const;
00364
00365 private:
00381 UnicodeString fSymbols[kFormatSymbolCount];
00382
00387 UnicodeString fNoSymbol;
00388
00389 Locale locale;
00390
00391 char actualLocale[ULOC_FULLNAME_CAPACITY];
00392 char validLocale[ULOC_FULLNAME_CAPACITY];
00393 const UChar* currPattern;
00394
00395 UnicodeString currencySpcBeforeSym[kCurrencySpacingCount];
00396 UnicodeString currencySpcAfterSym[kCurrencySpacingCount];
00397 };
00398
00399
00400
00401 inline UnicodeString
00402 DecimalFormatSymbols::getSymbol(ENumberFormatSymbol symbol) const {
00403 const UnicodeString *strPtr;
00404 if(symbol < kFormatSymbolCount) {
00405 strPtr = &fSymbols[symbol];
00406 } else {
00407 strPtr = &fNoSymbol;
00408 }
00409 return *strPtr;
00410 }
00411
00412 inline const UnicodeString &
00413 DecimalFormatSymbols::getConstSymbol(ENumberFormatSymbol symbol) const {
00414 const UnicodeString *strPtr;
00415 if(symbol < kFormatSymbolCount) {
00416 strPtr = &fSymbols[symbol];
00417 } else {
00418 strPtr = &fNoSymbol;
00419 }
00420 return *strPtr;
00421 }
00422
00423
00424
00425 inline void
00426 DecimalFormatSymbols::setSymbol(ENumberFormatSymbol symbol, const UnicodeString &value, const UBool propogateDigits = TRUE) {
00427 if(symbol<kFormatSymbolCount) {
00428 fSymbols[symbol]=value;
00429 }
00430
00431
00432
00433 if ( propogateDigits && symbol == kZeroDigitSymbol && value.countChar32() == 1 ) {
00434 UChar32 sym = value.char32At(0);
00435 if ( u_charDigitValue(sym) == 0 ) {
00436 for ( int8_t i = 1 ; i<= 9 ; i++ ) {
00437 sym++;
00438 fSymbols[(int)kOneDigitSymbol+i-1] = UnicodeString(sym);
00439 }
00440 }
00441 }
00442 }
00443
00444
00445
00446 inline Locale
00447 DecimalFormatSymbols::getLocale() const {
00448 return locale;
00449 }
00450
00451 inline const UChar*
00452 DecimalFormatSymbols::getCurrencyPattern() const {
00453 return currPattern;
00454 }
00455 U_NAMESPACE_END
00456
00457 #endif
00458
00459 #endif // _DCFMTSYM
00460