Main Page | Class Hierarchy | Alphabetical List | Data Structures | File List | Data Fields | Globals | Related Pages

decimfmt.h

00001 /* 00002 ******************************************************************************** 00003 * Copyright (C) 1997-2001, 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 U_NAMESPACE_BEGIN 00032 00033 class DecimalFormatSymbols; 00034 class DigitList; 00035 00180 class U_I18N_API DecimalFormat: public NumberFormat { 00181 public: 00182 enum ERoundingMode { 00183 kRoundCeiling, 00184 kRoundFloor, 00185 kRoundDown, 00186 kRoundUp, 00187 kRoundHalfEven, 00188 kRoundHalfDown, 00189 kRoundHalfUp 00190 // We don't support ROUND_UNNECESSARY 00191 }; 00192 00193 enum EPadPosition { 00194 kPadBeforePrefix, 00195 kPadAfterPrefix, 00196 kPadBeforeSuffix, 00197 kPadAfterSuffix 00198 }; 00199 00213 DecimalFormat(UErrorCode& status); 00214 00229 DecimalFormat(const UnicodeString& pattern, 00230 UErrorCode& status); 00231 00250 DecimalFormat( const UnicodeString& pattern, 00251 DecimalFormatSymbols* symbolsToAdopt, 00252 UErrorCode& status); 00253 00273 DecimalFormat( const UnicodeString& pattern, 00274 DecimalFormatSymbols* symbolsToAdopt, 00275 UParseError& parseError, 00276 UErrorCode& status); 00294 DecimalFormat( const UnicodeString& pattern, 00295 const DecimalFormatSymbols& symbols, 00296 UErrorCode& status); 00297 00302 DecimalFormat(const DecimalFormat& source); 00303 00308 DecimalFormat& operator=(const DecimalFormat& rhs); 00309 00314 virtual ~DecimalFormat(); 00315 00321 virtual Format* clone(void) const; 00322 00328 virtual UBool operator==(const Format& other) const; 00329 00341 virtual UnicodeString& format(double number, 00342 UnicodeString& toAppendTo, 00343 FieldPosition& pos) const; 00355 virtual UnicodeString& format(int32_t number, 00356 UnicodeString& toAppendTo, 00357 FieldPosition& pos) const; 00370 virtual UnicodeString& format(const Formattable& obj, 00371 UnicodeString& toAppendTo, 00372 FieldPosition& pos, 00373 UErrorCode& status) const; 00374 00379 UnicodeString& format(const Formattable& obj, 00380 UnicodeString& result, 00381 UErrorCode& status) const; 00382 00387 UnicodeString& format(double number, 00388 UnicodeString& output) const; 00389 00394 UnicodeString& format(int32_t number, 00395 UnicodeString& output) const; 00396 00416 virtual void parse(const UnicodeString& text, 00417 Formattable& result, 00418 ParsePosition& parsePosition) const; 00419 00420 // Declare here again to get rid of function hiding problems. 00422 virtual void parse(const UnicodeString& text, 00423 Formattable& result, 00424 UErrorCode& error) const; 00425 00433 virtual const DecimalFormatSymbols* getDecimalFormatSymbols(void) const; 00434 00441 virtual void adoptDecimalFormatSymbols(DecimalFormatSymbols* symbolsToAdopt); 00442 00449 virtual void setDecimalFormatSymbols(const DecimalFormatSymbols& symbols); 00450 00451 00458 UnicodeString& getPositivePrefix(UnicodeString& result) const; 00459 00466 virtual void setPositivePrefix(const UnicodeString& newValue); 00467 00474 UnicodeString& getNegativePrefix(UnicodeString& result) const; 00475 00482 virtual void setNegativePrefix(const UnicodeString& newValue); 00483 00490 UnicodeString& getPositiveSuffix(UnicodeString& result) const; 00491 00498 virtual void setPositiveSuffix(const UnicodeString& newValue); 00499 00506 UnicodeString& getNegativeSuffix(UnicodeString& result) const; 00507 00514 virtual void setNegativeSuffix(const UnicodeString& newValue); 00515 00525 int32_t getMultiplier(void) const; 00526 00536 virtual void setMultiplier(int32_t newValue); 00537 00547 virtual double getRoundingIncrement(void); 00548 00559 virtual void setRoundingIncrement(double newValue); 00560 00569 virtual ERoundingMode getRoundingMode(void); 00570 00580 virtual void setRoundingMode(ERoundingMode roundingMode); 00581 00592 virtual int32_t getFormatWidth(void); 00593 00607 virtual void setFormatWidth(int32_t width); 00608 00619 inline UChar getPadCharacter(void); 00620 00634 virtual UnicodeString getPadCharacterString(); 00635 00647 inline void setPadCharacter(UChar padChar); 00648 00663 virtual void setPadCharacter(UnicodeString padChar); 00664 00683 virtual EPadPosition getPadPosition(void); 00684 00705 virtual void setPadPosition(EPadPosition padPos); 00706 00717 virtual UBool isScientificNotation(void); 00718 00730 virtual void setScientificNotation(UBool useScientific); 00731 00742 virtual int8_t getMinimumExponentDigits(void); 00743 00756 virtual void setMinimumExponentDigits(int8_t minExpDig); 00757 00770 virtual UBool isExponentSignAlwaysShown(void); 00771 00785 virtual void setExponentSignAlwaysShown(UBool expSignAlways); 00786 00796 int32_t getGroupingSize(void) const; 00797 00807 virtual void setGroupingSize(int32_t newValue); 00808 00826 int32_t getSecondaryGroupingSize(void) const; 00827 00836 virtual void setSecondaryGroupingSize(int32_t newValue); 00837 00845 UBool isDecimalSeparatorAlwaysShown(void) const; 00846 00854 virtual void setDecimalSeparatorAlwaysShown(UBool newValue); 00855 00862 virtual UnicodeString& toPattern(UnicodeString& result) const; 00863 00871 virtual UnicodeString& toLocalizedPattern(UnicodeString& result) const; 00872 00903 virtual void applyPattern(const UnicodeString& pattern, 00904 UParseError& parseError, 00905 UErrorCode& status); 00914 virtual void applyPattern(const UnicodeString& pattern, 00915 UErrorCode& status); 00916 00945 virtual void applyLocalizedPattern(const UnicodeString& pattern, 00946 UParseError& parseError, 00947 UErrorCode& status); 00948 00949 /* 00950 * Apply the given pattern to this Format object. 00951 * @stable 00952 */ 00953 virtual void applyLocalizedPattern(const UnicodeString& pattern, 00954 UErrorCode& status); 00955 00956 00963 virtual void setMaximumIntegerDigits(int32_t newValue); 00964 00971 virtual void setMinimumIntegerDigits(int32_t newValue); 00972 00979 virtual void setMaximumFractionDigits(int32_t newValue); 00980 00987 virtual void setMinimumFractionDigits(int32_t newValue); 00988 00994 static const char fgNumberPatterns[]; 00995 00996 public: 00997 01009 static UClassID getStaticClassID(void) { return (UClassID)&fgClassID; } 01010 01022 virtual UClassID getDynamicClassID(void) const { return getStaticClassID(); } 01023 01024 private: 01025 static const char fgClassID; 01029 void construct(UErrorCode& status, 01030 UParseError& parseErr, 01031 const UnicodeString* pattern = 0, 01032 DecimalFormatSymbols* symbolsToAdopt = 0, 01033 const Locale& locale = Locale::getDefault() 01034 ); 01035 01039 UnicodeString& toPattern(UnicodeString& result, UBool localized) const; 01040 01051 void applyPattern(const UnicodeString& pattern, 01052 UBool localized, 01053 UParseError& parseError, 01054 UErrorCode& status); 01058 UnicodeString& subformat(UnicodeString& result, 01059 FieldPosition& fieldPosition, 01060 DigitList& digits, 01061 UBool isInteger) const; 01062 01063 enum { 01064 fgStatusInfinite, 01065 fgStatusLength // Leave last in list. 01066 } StatusFlags; 01067 01080 UBool subparse(const UnicodeString& text, ParsePosition& parsePosition, 01081 DigitList& digits, UBool* status) const; 01082 01088 void appendAffix(UnicodeString& buffer, const UnicodeString& affix, 01089 UBool localized) const; 01090 01091 void appendAffix(UnicodeString& buffer, 01092 const UnicodeString* affixPattern, 01093 const UnicodeString& expAffix, UBool localized) const; 01094 01095 void expandAffix(const UnicodeString& pattern, 01096 UnicodeString& affix) const; 01097 01098 void expandAffixes(void); 01099 01100 static double round(double a, ERoundingMode mode, UBool isNegative); 01101 01102 void addPadding(UnicodeString& result, 01103 FieldPosition& fieldPosition, 01104 UBool hasAffixes, 01105 UBool isNegative) const; 01106 01107 UBool isGroupingPosition(int32_t pos) const; 01108 01112 //static const int8_t fgMaxDigit; // The largest digit, in this case 9 01113 01114 /*transient*/ //DigitList* fDigitList; 01115 01116 UnicodeString fPositivePrefix; 01117 UnicodeString fPositiveSuffix; 01118 UnicodeString fNegativePrefix; 01119 UnicodeString fNegativeSuffix; 01120 UnicodeString* fPosPrefixPattern; 01121 UnicodeString* fPosSuffixPattern; 01122 UnicodeString* fNegPrefixPattern; 01123 UnicodeString* fNegSuffixPattern; 01124 int32_t fMultiplier; 01125 int32_t fGroupingSize; 01126 int32_t fGroupingSize2; 01127 UBool fDecimalSeparatorAlwaysShown; 01128 /*transient*/ UBool fIsCurrencyFormat; 01129 /* @deprecated */ DecimalFormatSymbols* fSymbols; 01130 01131 UBool fUseExponentialNotation; 01132 int8_t fMinExponentDigits; 01133 UBool fExponentSignAlwaysShown; 01134 01135 /* If fRoundingIncrement is NULL, there is no rounding. Otherwise, round to 01136 * fRoundingIncrement.getDouble(). Since this operation may be expensive, 01137 * we cache the result in fRoundingDouble. All methods that update 01138 * fRoundingIncrement also update fRoundingDouble. */ 01139 DigitList* fRoundingIncrement; 01140 /*transient*/ double fRoundingDouble; 01141 ERoundingMode fRoundingMode; 01142 01143 UnicodeString fPad; 01144 int32_t fFormatWidth; 01145 EPadPosition fPadPosition; 01146 01147 // Constants for characters used in programmatic (unlocalized) patterns. 01148 static const UChar kPatternZeroDigit; 01149 static const UChar kPatternGroupingSeparator; 01150 static const UChar kPatternDecimalSeparator; 01151 static const UChar kPatternPerMill; 01152 static const UChar kPatternPercent; 01153 static const UChar kPatternDigit; 01154 static const UChar kPatternSeparator; 01155 static const UChar kPatternExponent; 01156 static const UChar kPatternPlus; 01157 static const UChar kPatternMinus; 01158 static const UChar kPatternPadEscape; 01159 01167 static const UChar kCurrencySign; 01168 static const UChar kQuote; 01169 01170 protected: 01171 static const int32_t kDoubleIntegerDigits; 01172 static const int32_t kDoubleFractionDigits; 01173 }; 01174 01175 inline UnicodeString& 01176 DecimalFormat::format(const Formattable& obj, 01177 UnicodeString& result, 01178 UErrorCode& status) const { 01179 // Don't use Format:: - use immediate base class only, 01180 // in case immediate base modifies behavior later. 01181 return NumberFormat::format(obj, result, status); 01182 } 01183 01184 inline UnicodeString& 01185 DecimalFormat::format(double number, 01186 UnicodeString& output) const { 01187 FieldPosition pos(0); 01188 return format(number, output, pos); 01189 } 01190 01191 inline UnicodeString& 01192 DecimalFormat::format(int32_t number, 01193 UnicodeString& output) const { 01194 FieldPosition pos(0); 01195 return format(number, output, pos); 01196 } 01197 01198 inline UChar 01199 DecimalFormat::getPadCharacter() { 01200 return getPadCharacterString().charAt(0); 01201 } 01202 01203 inline void 01204 DecimalFormat::setPadCharacter(UChar padChar) { 01205 setPadCharacter(UnicodeString(padChar)); 01206 } 01207 01208 U_NAMESPACE_END 01209 01210 #endif // _DECIMFMT 01211 //eof

Generated on Fri Aug 13 09:53:50 2004 for ICU 2.1 by doxygen 1.3.7