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
00026
00027 #ifndef DCFMTSYM_H
00028 #define DCFMTSYM_H
00029
00030 #include "unicode/utypes.h"
00031 #include "unicode/uchar.h"
00032
00033 #if !UCONFIG_NO_FORMATTING
00034
00035 #include "unicode/uobject.h"
00036 #include "unicode/locid.h"
00037 #include "unicode/numsys.h"
00038 #include "unicode/unum.h"
00039 #include "unicode/unistr.h"
00040
00047 U_NAMESPACE_BEGIN
00048
00084 class U_I18N_API DecimalFormatSymbols : public UObject {
00085 public:
00090 enum ENumberFormatSymbol {
00092 kDecimalSeparatorSymbol,
00094 kGroupingSeparatorSymbol,
00096 kPatternSeparatorSymbol,
00098 kPercentSymbol,
00100 kZeroDigitSymbol,
00102 kDigitSymbol,
00104 kMinusSignSymbol,
00106 kPlusSignSymbol,
00108 kCurrencySymbol,
00110 kIntlCurrencySymbol,
00112 kMonetarySeparatorSymbol,
00114 kExponentialSymbol,
00116 kPerMillSymbol,
00118 kPadEscapeSymbol,
00120 kInfinitySymbol,
00122 kNaNSymbol,
00125 kSignificantDigitSymbol,
00129 kMonetaryGroupingSeparatorSymbol,
00133 kOneDigitSymbol,
00137 kTwoDigitSymbol,
00141 kThreeDigitSymbol,
00145 kFourDigitSymbol,
00149 kFiveDigitSymbol,
00153 kSixDigitSymbol,
00157 kSevenDigitSymbol,
00161 kEightDigitSymbol,
00165 kNineDigitSymbol,
00169 kExponentMultiplicationSymbol,
00171 kFormatSymbolCount = kNineDigitSymbol + 2
00172 };
00173
00182 DecimalFormatSymbols(const Locale& locale, UErrorCode& status);
00183
00200 DecimalFormatSymbols(const Locale& locale, const NumberingSystem& ns, UErrorCode& status);
00201
00212 DecimalFormatSymbols(UErrorCode& status);
00213
00229 static DecimalFormatSymbols* createWithLastResortData(UErrorCode& status);
00230
00235 DecimalFormatSymbols(const DecimalFormatSymbols&);
00236
00241 DecimalFormatSymbols& operator=(const DecimalFormatSymbols&);
00242
00247 virtual ~DecimalFormatSymbols();
00248
00256 UBool operator==(const DecimalFormatSymbols& other) const;
00257
00265 UBool operator!=(const DecimalFormatSymbols& other) const { return !operator==(other); }
00266
00276 inline UnicodeString getSymbol(ENumberFormatSymbol symbol) const;
00277
00290 void setSymbol(ENumberFormatSymbol symbol, const UnicodeString &value, const UBool propogateDigits);
00291
00296 inline Locale getLocale() const;
00297
00303 Locale getLocale(ULocDataLocaleType type, UErrorCode& status) const;
00304
00321 const UnicodeString& getPatternForCurrencySpacing(UCurrencySpacing type,
00322 UBool beforeCurrency,
00323 UErrorCode& status) const;
00334 void setPatternForCurrencySpacing(UCurrencySpacing type,
00335 UBool beforeCurrency,
00336 const UnicodeString& pattern);
00337
00343 virtual UClassID getDynamicClassID() const;
00344
00350 static UClassID U_EXPORT2 getStaticClassID();
00351
00352 private:
00353 DecimalFormatSymbols();
00354
00367 void initialize(const Locale& locale, UErrorCode& success,
00368 UBool useLastResortData = FALSE, const NumberingSystem* ns = nullptr);
00369
00373 void initialize();
00374
00375 void setCurrencyForSymbols();
00376
00377 public:
00378
00379 #ifndef U_HIDE_INTERNAL_API
00380
00383 inline UBool isCustomCurrencySymbol() const {
00384 return fIsCustomCurrencySymbol;
00385 }
00386
00390 inline UBool isCustomIntlCurrencySymbol() const {
00391 return fIsCustomIntlCurrencySymbol;
00392 }
00393
00397 inline UChar32 getCodePointZero() const {
00398 return fCodePointZero;
00399 }
00400 #endif
00401
00417 inline const UnicodeString& getConstSymbol(ENumberFormatSymbol symbol) const;
00418
00419 #ifndef U_HIDE_INTERNAL_API
00420
00435 inline const UnicodeString& getConstDigitSymbol(int32_t digit) const;
00436
00441 inline const char16_t* getCurrencyPattern(void) const;
00442 #endif
00443
00444 private:
00460 UnicodeString fSymbols[kFormatSymbolCount];
00461
00466 UnicodeString fNoSymbol;
00467
00482 UChar32 fCodePointZero;
00483
00484 Locale locale;
00485
00486 char actualLocale[ULOC_FULLNAME_CAPACITY];
00487 char validLocale[ULOC_FULLNAME_CAPACITY];
00488 const char16_t* currPattern;
00489
00490 UnicodeString currencySpcBeforeSym[UNUM_CURRENCY_SPACING_COUNT];
00491 UnicodeString currencySpcAfterSym[UNUM_CURRENCY_SPACING_COUNT];
00492 UBool fIsCustomCurrencySymbol;
00493 UBool fIsCustomIntlCurrencySymbol;
00494 };
00495
00496
00497
00498 inline UnicodeString
00499 DecimalFormatSymbols::getSymbol(ENumberFormatSymbol symbol) const {
00500 const UnicodeString *strPtr;
00501 if(symbol < kFormatSymbolCount) {
00502 strPtr = &fSymbols[symbol];
00503 } else {
00504 strPtr = &fNoSymbol;
00505 }
00506 return *strPtr;
00507 }
00508
00509
00510 inline const UnicodeString &
00511 DecimalFormatSymbols::getConstSymbol(ENumberFormatSymbol symbol) const {
00512 const UnicodeString *strPtr;
00513 if(symbol < kFormatSymbolCount) {
00514 strPtr = &fSymbols[symbol];
00515 } else {
00516 strPtr = &fNoSymbol;
00517 }
00518 return *strPtr;
00519 }
00520
00521 #ifndef U_HIDE_INTERNAL_API
00522 inline const UnicodeString& DecimalFormatSymbols::getConstDigitSymbol(int32_t digit) const {
00523 if (digit < 0 || digit > 9) {
00524 digit = 0;
00525 }
00526 if (digit == 0) {
00527 return fSymbols[kZeroDigitSymbol];
00528 }
00529 ENumberFormatSymbol key = static_cast<ENumberFormatSymbol>(kOneDigitSymbol + digit - 1);
00530 return fSymbols[key];
00531 }
00532 #endif
00533
00534
00535
00536 inline void
00537 DecimalFormatSymbols::setSymbol(ENumberFormatSymbol symbol, const UnicodeString &value, const UBool propogateDigits = TRUE) {
00538 if (symbol == kCurrencySymbol) {
00539 fIsCustomCurrencySymbol = TRUE;
00540 }
00541 else if (symbol == kIntlCurrencySymbol) {
00542 fIsCustomIntlCurrencySymbol = TRUE;
00543 }
00544 if(symbol<kFormatSymbolCount) {
00545 fSymbols[symbol]=value;
00546 }
00547
00548
00549
00550
00551 if (symbol == kZeroDigitSymbol) {
00552 UChar32 sym = value.char32At(0);
00553 if ( propogateDigits && u_charDigitValue(sym) == 0 && value.countChar32() == 1 ) {
00554 fCodePointZero = sym;
00555 for ( int8_t i = 1 ; i<= 9 ; i++ ) {
00556 sym++;
00557 fSymbols[(int)kOneDigitSymbol+i-1] = UnicodeString(sym);
00558 }
00559 } else {
00560 fCodePointZero = -1;
00561 }
00562 } else if (symbol >= kOneDigitSymbol && symbol <= kNineDigitSymbol) {
00563 fCodePointZero = -1;
00564 }
00565 }
00566
00567
00568
00569 inline Locale
00570 DecimalFormatSymbols::getLocale() const {
00571 return locale;
00572 }
00573
00574 #ifndef U_HIDE_INTERNAL_API
00575 inline const char16_t*
00576 DecimalFormatSymbols::getCurrencyPattern() const {
00577 return currPattern;
00578 }
00579 #endif
00580
00581 U_NAMESPACE_END
00582
00583 #endif
00584
00585 #endif // _DCFMTSYM
00586