00001 /* 00002 ******************************************************************************** 00003 * Copyright (C) 1997-1999, International Business Machines 00004 * Corporation and others. All Rights Reserved. 00005 ******************************************************************************** 00006 * 00007 * File DECIMFMT.H 00008 * 00009 * Modification History: 00010 * 00011 * Date Name Description 00012 * 02/19/97 aliu Converted from java. 00013 * 03/20/97 clhuang Updated per C++ implementation. 00014 * 04/03/97 aliu Rewrote parsing and formatting completely, and 00015 * cleaned up and debugged. Actually works now. 00016 * 04/17/97 aliu Changed DigitCount to int per code review. 00017 * 07/10/97 helena Made ParsePosition a class and get rid of the function 00018 * hiding problems. 00019 * 09/09/97 aliu Ported over support for exponential formats. 00020 * 07/20/98 stephen Changed documentation 00021 ******************************************************************************** 00022 */ 00023 00024 #ifndef DECIMFMT_H 00025 #define DECIMFMT_H 00026 00027 #include "unicode/utypes.h" 00028 #include "unicode/numfmt.h" 00029 #include "unicode/locid.h" 00030 00031 class DecimalFormatSymbols; 00032 class DigitList; 00033 00172 class U_I18N_API DecimalFormat: public NumberFormat { 00173 public: 00174 enum ERoundingMode { 00175 kRoundCeiling, 00176 kRoundFloor, 00177 kRoundDown, 00178 kRoundUp, 00179 kRoundHalfEven, 00180 kRoundHalfDown, 00181 kRoundHalfUp 00182 // We don't support ROUND_UNNECESSARY 00183 }; 00184 00185 enum EPadPosition { 00186 kPadBeforePrefix, 00187 kPadAfterPrefix, 00188 kPadBeforeSuffix, 00189 kPadAfterSuffix 00190 }; 00191 00205 DecimalFormat(UErrorCode& status); 00206 00221 DecimalFormat(const UnicodeString& pattern, 00222 UErrorCode& status); 00223 00242 DecimalFormat( const UnicodeString& pattern, 00243 DecimalFormatSymbols* symbolsToAdopt, 00244 UErrorCode& status); 00245 00263 DecimalFormat( const UnicodeString& pattern, 00264 const DecimalFormatSymbols& symbols, 00265 UErrorCode& status); 00266 00271 DecimalFormat(const DecimalFormat& source); 00272 00277 DecimalFormat& operator=(const DecimalFormat& rhs); 00278 00283 virtual ~DecimalFormat(); 00284 00290 virtual Format* clone(void) const; 00291 00297 virtual UBool operator==(const Format& other) const; 00298 00310 virtual UnicodeString& format(double number, 00311 UnicodeString& toAppendTo, 00312 FieldPosition& pos) const; 00313 virtual UnicodeString& format(int32_t number, 00314 UnicodeString& toAppendTo, 00315 FieldPosition& pos) const; 00316 virtual UnicodeString& format(const Formattable& obj, 00317 UnicodeString& toAppendTo, 00318 FieldPosition& pos, 00319 UErrorCode& status) const; 00320 00325 UnicodeString& format(const Formattable& obj, 00326 UnicodeString& result, 00327 UErrorCode& status) const; 00328 00333 UnicodeString& format(double number, 00334 UnicodeString& output) const; 00335 00340 UnicodeString& format(int32_t number, 00341 UnicodeString& output) const; 00342 00357 virtual void parse(const UnicodeString& text, 00358 Formattable& result, 00359 ParsePosition& parsePosition) const; 00360 00361 // Declare here again to get rid of function hiding problems. 00362 virtual void parse(const UnicodeString& text, 00363 Formattable& result, 00364 UErrorCode& error) const; 00365 00373 virtual const DecimalFormatSymbols* getDecimalFormatSymbols(void) const; 00374 00381 virtual void adoptDecimalFormatSymbols(DecimalFormatSymbols* symbolsToAdopt); 00382 00389 virtual void setDecimalFormatSymbols(const DecimalFormatSymbols& symbols); 00390 00391 00398 UnicodeString& getPositivePrefix(UnicodeString& result) const; 00399 00406 virtual void setPositivePrefix(const UnicodeString& newValue); 00407 00414 UnicodeString& getNegativePrefix(UnicodeString& result) const; 00415 00422 virtual void setNegativePrefix(const UnicodeString& newValue); 00423 00430 UnicodeString& getPositiveSuffix(UnicodeString& result) const; 00431 00438 virtual void setPositiveSuffix(const UnicodeString& newValue); 00439 00446 UnicodeString& getNegativeSuffix(UnicodeString& result) const; 00447 00454 virtual void setNegativeSuffix(const UnicodeString& newValue); 00455 00465 int32_t getMultiplier(void) const; 00466 00476 virtual void setMultiplier(int32_t newValue); 00477 00487 virtual double getRoundingIncrement(void); 00488 00499 virtual void setRoundingIncrement(double newValue); 00500 00509 virtual ERoundingMode getRoundingMode(void); 00510 00520 virtual void setRoundingMode(ERoundingMode roundingMode); 00521 00532 virtual int32_t getFormatWidth(void); 00533 00547 virtual void setFormatWidth(int32_t width); 00548 00559 inline UChar getPadCharacter(void); 00560 00574 virtual UnicodeString getPadCharacterString(); 00575 00587 inline void setPadCharacter(UChar padChar); 00588 00603 virtual void setPadCharacter(UnicodeString padChar); 00604 00623 virtual EPadPosition getPadPosition(void); 00624 00645 virtual void setPadPosition(EPadPosition padPos); 00646 00657 virtual UBool isScientificNotation(void); 00658 00670 virtual void setScientificNotation(UBool useScientific); 00671 00682 virtual int8_t getMinimumExponentDigits(void); 00683 00696 virtual void setMinimumExponentDigits(int8_t minExpDig); 00697 00710 virtual UBool isExponentSignAlwaysShown(void); 00711 00725 virtual void setExponentSignAlwaysShown(UBool expSignAlways); 00726 00736 int32_t getGroupingSize(void) const; 00737 00747 virtual void setGroupingSize(int32_t newValue); 00748 00766 int32_t getSecondaryGroupingSize(void) const; 00767 00776 virtual void setSecondaryGroupingSize(int32_t newValue); 00777 00785 UBool isDecimalSeparatorAlwaysShown(void) const; 00786 00794 virtual void setDecimalSeparatorAlwaysShown(UBool newValue); 00795 00802 virtual UnicodeString& toPattern(UnicodeString& result) const; 00803 00811 virtual UnicodeString& toLocalizedPattern(UnicodeString& result) const; 00812 00840 virtual void applyPattern(const UnicodeString& pattern, 00841 UErrorCode& status); 00842 00871 virtual void applyLocalizedPattern(const UnicodeString& pattern, 00872 UErrorCode& status); 00873 00880 virtual void setMaximumIntegerDigits(int32_t newValue); 00881 00888 virtual void setMinimumIntegerDigits(int32_t newValue); 00889 00896 virtual void setMaximumFractionDigits(int32_t newValue); 00897 00904 virtual void setMinimumFractionDigits(int32_t newValue); 00905 00911 static const char *fgNumberPatterns; 00912 00913 public: 00914 00926 static UClassID getStaticClassID(void) { return (UClassID)&fgClassID; } 00927 00939 virtual UClassID getDynamicClassID(void) const { return getStaticClassID(); } 00940 00941 private: 00942 static char fgClassID; 00943 00947 void construct(UErrorCode& status, 00948 const UnicodeString* pattern = 0, 00949 DecimalFormatSymbols* symbolsToAdopt = 0, 00950 const Locale& locale = Locale::getDefault()); 00951 00955 UnicodeString& toPattern(UnicodeString& result, UBool localized) const; 00956 00965 void applyPattern(const UnicodeString& pattern, 00966 UBool localized, 00967 UErrorCode& status); 00968 00972 UnicodeString& subformat(UnicodeString& result, 00973 FieldPosition& fieldPosition, 00974 UBool isNegative, 00975 UBool isInteger) const; 00976 00977 static const int32_t fgStatusInfinite; 00978 static const int32_t fgStatusPositive; 00979 static const int32_t fgStatusLength; 00980 00993 UBool subparse(const UnicodeString& text, ParsePosition& parsePosition, 00994 DigitList& digits, UBool isExponent, 00995 UBool* status) const; 00996 01002 void appendAffix(UnicodeString& buffer, const UnicodeString& affix, 01003 UBool localized) const; 01004 01005 void appendAffix(UnicodeString& buffer, 01006 const UnicodeString* affixPattern, 01007 const UnicodeString& expAffix, UBool localized) const; 01008 01009 void expandAffix(const UnicodeString& pattern, 01010 UnicodeString& affix) const; 01011 01012 void expandAffixes(void); 01013 01014 static double round(double a, ERoundingMode mode, UBool isNegative); 01015 01016 void addPadding(UnicodeString& result, UBool hasAffixes, 01017 UBool isNegative) const; 01018 01019 UBool isGroupingPosition(int32_t pos) const; 01020 01024 static const int8_t fgMaxDigit; // The largest digit, in this case 9 01025 01026 /*transient*/ DigitList* fDigitList; 01027 01028 UnicodeString fPositivePrefix; 01029 UnicodeString fPositiveSuffix; 01030 UnicodeString fNegativePrefix; 01031 UnicodeString fNegativeSuffix; 01032 UnicodeString* fPosPrefixPattern; 01033 UnicodeString* fPosSuffixPattern; 01034 UnicodeString* fNegPrefixPattern; 01035 UnicodeString* fNegSuffixPattern; 01036 int32_t fMultiplier; 01037 int32_t fGroupingSize; 01038 int32_t fGroupingSize2; 01039 UBool fDecimalSeparatorAlwaysShown; 01040 /*transient*/ UBool fIsCurrencyFormat; 01041 DecimalFormatSymbols* fSymbols; 01042 01043 UBool fUseExponentialNotation; 01044 int8_t fMinExponentDigits; 01045 UBool fExponentSignAlwaysShown; 01046 01047 /* If fRoundingIncrement is NULL, there is no rounding. Otherwise, round to 01048 * fRoundingIncrement.getDouble(). Since this operation may be expensive, 01049 * we cache the result in fRoundingDouble. All methods that update 01050 * fRoundingIncrement also update fRoundingDouble. */ 01051 DigitList* fRoundingIncrement; 01052 /*transient*/ double fRoundingDouble; 01053 ERoundingMode fRoundingMode; 01054 01055 UChar fPad; 01056 int32_t fFormatWidth; 01057 EPadPosition fPadPosition; 01058 01059 // Constants for characters used in programmatic (unlocalized) patterns. 01060 static const UChar kPatternZeroDigit; 01061 static const UChar kPatternGroupingSeparator; 01062 static const UChar kPatternDecimalSeparator; 01063 static const UChar kPatternPerMill; 01064 static const UChar kPatternPercent; 01065 static const UChar kPatternDigit; 01066 static const UChar kPatternSeparator; 01067 static const UChar kPatternExponent; 01068 static const UChar kPatternPlus; 01069 static const UChar kPatternMinus; 01070 static const UChar kPatternPadEscape; 01071 01079 static const UChar kCurrencySign; 01080 static const UChar kQuote; 01081 01082 protected: 01083 static const int32_t kDoubleIntegerDigits; 01084 static const int32_t kDoubleFractionDigits; 01085 }; 01086 01087 inline UnicodeString& 01088 DecimalFormat::format(const Formattable& obj, 01089 UnicodeString& result, 01090 UErrorCode& status) const { 01091 // Don't use Format:: - use immediate base class only, 01092 // in case immediate base modifies behavior later. 01093 return NumberFormat::format(obj, result, status); 01094 } 01095 01096 inline UnicodeString& 01097 DecimalFormat::format(double number, 01098 UnicodeString& output) const { 01099 return NumberFormat::format(number, output); 01100 } 01101 01102 inline UnicodeString& 01103 DecimalFormat::format(int32_t number, 01104 UnicodeString& output) const { 01105 return NumberFormat::format(number, output); 01106 } 01107 01108 inline UChar 01109 DecimalFormat::getPadCharacter() { 01110 return getPadCharacterString().charAt(0); 01111 } 01112 01113 inline void 01114 DecimalFormat::setPadCharacter(UChar padChar) { 01115 setPadCharacter(UnicodeString(padChar)); 01116 } 01117 01118 #endif // _DECIMFMT 01119 //eof