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 00163 class U_I18N_API DecimalFormat: public NumberFormat { 00164 public: 00165 enum ERoundingMode { 00166 kRoundCeiling, 00167 kRoundFloor, 00168 kRoundDown, 00169 kRoundUp, 00170 kRoundHalfEven, 00171 kRoundHalfDown, 00172 kRoundHalfUp 00173 // We don't support ROUND_UNNECESSARY 00174 }; 00175 00176 enum EPadPosition { 00177 kPadBeforePrefix, 00178 kPadAfterPrefix, 00179 kPadBeforeSuffix, 00180 kPadAfterSuffix 00181 }; 00182 00196 DecimalFormat(UErrorCode& status); 00197 00212 DecimalFormat(const UnicodeString& pattern, 00213 UErrorCode& status); 00214 00233 DecimalFormat( const UnicodeString& pattern, 00234 DecimalFormatSymbols* symbolsToAdopt, 00235 UErrorCode& status); 00236 00254 DecimalFormat( const UnicodeString& pattern, 00255 const DecimalFormatSymbols& symbols, 00256 UErrorCode& status); 00257 00262 DecimalFormat(const DecimalFormat& source); 00263 00268 DecimalFormat& operator=(const DecimalFormat& rhs); 00269 00274 virtual ~DecimalFormat(); 00275 00281 virtual Format* clone(void) const; 00282 00288 virtual UBool operator==(const Format& other) const; 00289 00301 virtual UnicodeString& format(double number, 00302 UnicodeString& toAppendTo, 00303 FieldPosition& pos) const; 00304 virtual UnicodeString& format(int32_t number, 00305 UnicodeString& toAppendTo, 00306 FieldPosition& pos) const; 00307 virtual UnicodeString& format(const Formattable& obj, 00308 UnicodeString& toAppendTo, 00309 FieldPosition& pos, 00310 UErrorCode& status) const; 00311 00316 UnicodeString& format(const Formattable& obj, 00317 UnicodeString& result, 00318 UErrorCode& status) const; 00319 00324 UnicodeString& format(double number, 00325 UnicodeString& output) const; 00326 00331 UnicodeString& format(int32_t number, 00332 UnicodeString& output) const; 00333 00348 virtual void parse(const UnicodeString& text, 00349 Formattable& result, 00350 ParsePosition& parsePosition) const; 00351 00352 // Declare here again to get rid of function hiding problems. 00353 virtual void parse(const UnicodeString& text, 00354 Formattable& result, 00355 UErrorCode& error) const; 00356 00364 virtual const DecimalFormatSymbols* getDecimalFormatSymbols(void) const; 00365 00372 virtual void adoptDecimalFormatSymbols(DecimalFormatSymbols* symbolsToAdopt); 00373 00380 virtual void setDecimalFormatSymbols(const DecimalFormatSymbols& symbols); 00381 00382 00389 UnicodeString& getPositivePrefix(UnicodeString& result) const; 00390 00397 virtual void setPositivePrefix(const UnicodeString& newValue); 00398 00405 UnicodeString& getNegativePrefix(UnicodeString& result) const; 00406 00413 virtual void setNegativePrefix(const UnicodeString& newValue); 00414 00421 UnicodeString& getPositiveSuffix(UnicodeString& result) const; 00422 00429 virtual void setPositiveSuffix(const UnicodeString& newValue); 00430 00437 UnicodeString& getNegativeSuffix(UnicodeString& result) const; 00438 00445 virtual void setNegativeSuffix(const UnicodeString& newValue); 00446 00456 int32_t getMultiplier(void) const; 00457 00467 virtual void setMultiplier(int32_t newValue); 00468 00478 virtual double getRoundingIncrement(void); 00479 00490 virtual void setRoundingIncrement(double newValue); 00491 00500 virtual ERoundingMode getRoundingMode(void); 00501 00511 virtual void setRoundingMode(ERoundingMode roundingMode); 00512 00523 virtual int32_t getFormatWidth(void); 00524 00538 virtual void setFormatWidth(int32_t width); 00539 00550 inline UChar getPadCharacter(void); 00551 00563 virtual UnicodeString getPadCharacterString(); 00564 00576 inline void setPadCharacter(UChar padChar); 00577 00590 virtual void setPadCharacter(UnicodeString padChar); 00591 00610 virtual EPadPosition getPadPosition(void); 00611 00632 virtual void setPadPosition(EPadPosition padPos); 00633 00644 virtual UBool isScientificNotation(void); 00645 00657 virtual void setScientificNotation(UBool useScientific); 00658 00669 virtual int8_t getMinimumExponentDigits(void); 00670 00683 virtual void setMinimumExponentDigits(int8_t minExpDig); 00684 00697 virtual UBool isExponentSignAlwaysShown(void); 00698 00712 virtual void setExponentSignAlwaysShown(UBool expSignAlways); 00713 00723 int32_t getGroupingSize(void) const; 00724 00734 virtual void setGroupingSize(int32_t newValue); 00735 00743 UBool isDecimalSeparatorAlwaysShown(void) const; 00744 00752 virtual void setDecimalSeparatorAlwaysShown(UBool newValue); 00753 00760 virtual UnicodeString& toPattern(UnicodeString& result) const; 00761 00769 virtual UnicodeString& toLocalizedPattern(UnicodeString& result) const; 00770 00798 virtual void applyPattern(const UnicodeString& pattern, 00799 UErrorCode& status); 00800 00829 virtual void applyLocalizedPattern(const UnicodeString& pattern, 00830 UErrorCode& status); 00831 00838 virtual void setMaximumIntegerDigits(int32_t newValue); 00839 00846 virtual void setMinimumIntegerDigits(int32_t newValue); 00847 00854 virtual void setMaximumFractionDigits(int32_t newValue); 00855 00862 virtual void setMinimumFractionDigits(int32_t newValue); 00863 00869 static const char *fgNumberPatterns; 00870 00871 public: 00872 00884 static UClassID getStaticClassID(void) { return (UClassID)&fgClassID; } 00885 00897 virtual UClassID getDynamicClassID(void) const { return getStaticClassID(); } 00898 00899 private: 00900 static char fgClassID; 00901 00905 void construct(UErrorCode& status, 00906 const UnicodeString* pattern = 0, 00907 DecimalFormatSymbols* symbolsToAdopt = 0, 00908 const Locale& locale = Locale::getDefault()); 00909 00913 UnicodeString& toPattern(UnicodeString& result, UBool localized) const; 00914 00923 void applyPattern(const UnicodeString& pattern, 00924 UBool localized, 00925 UErrorCode& status); 00926 00930 UnicodeString& subformat(UnicodeString& result, 00931 FieldPosition& fieldPosition, 00932 UBool isNegative, 00933 UBool isInteger) const; 00934 00935 static const int32_t fgStatusInfinite; 00936 static const int32_t fgStatusPositive; 00937 static const int32_t fgStatusLength; 00938 00951 UBool subparse(const UnicodeString& text, ParsePosition& parsePosition, 00952 DigitList& digits, UBool isExponent, 00953 UBool* status) const; 00954 00960 void appendAffix(UnicodeString& buffer, const UnicodeString& affix, 00961 UBool localized) const; 00962 00963 void appendAffix(UnicodeString& buffer, 00964 const UnicodeString* affixPattern, 00965 const UnicodeString& expAffix, UBool localized) const; 00966 00967 void expandAffix(const UnicodeString& pattern, 00968 UnicodeString& affix) const; 00969 00970 void expandAffixes(void); 00971 00972 static double round(double a, ERoundingMode mode, UBool isNegative); 00973 00974 void addPadding(UnicodeString& result, UBool hasAffixes, 00975 UBool isNegative) const; 00976 00980 static const int8_t fgMaxDigit; // The largest digit, in this case 9 00981 00982 /*transient*/ DigitList* fDigitList; 00983 00984 UnicodeString fPositivePrefix; 00985 UnicodeString fPositiveSuffix; 00986 UnicodeString fNegativePrefix; 00987 UnicodeString fNegativeSuffix; 00988 UnicodeString* fPosPrefixPattern; 00989 UnicodeString* fPosSuffixPattern; 00990 UnicodeString* fNegPrefixPattern; 00991 UnicodeString* fNegSuffixPattern; 00992 int32_t fMultiplier; 00993 int32_t fGroupingSize; 00994 UBool fDecimalSeparatorAlwaysShown; 00995 /*transient*/ UBool fIsCurrencyFormat; 00996 DecimalFormatSymbols* fSymbols; 00997 00998 UBool fUseExponentialNotation; 00999 int8_t fMinExponentDigits; 01000 UBool fExponentSignAlwaysShown; 01001 01002 /* If fRoundingIncrement is NULL, there is no rounding. Otherwise, round to 01003 * fRoundingIncrement.getDouble(). Since this operation may be expensive, 01004 * we cache the result in fRoundingDouble. All methods that update 01005 * fRoundingIncrement also update fRoundingDouble. */ 01006 DigitList* fRoundingIncrement; 01007 /*transient*/ double fRoundingDouble; 01008 ERoundingMode fRoundingMode; 01009 01010 UChar fPad; 01011 int32_t fFormatWidth; 01012 EPadPosition fPadPosition; 01013 01014 // Constants for characters used in programmatic (unlocalized) patterns. 01015 static const UChar kPatternZeroDigit; 01016 static const UChar kPatternGroupingSeparator; 01017 static const UChar kPatternDecimalSeparator; 01018 static const UChar kPatternPerMill; 01019 static const UChar kPatternPercent; 01020 static const UChar kPatternDigit; 01021 static const UChar kPatternSeparator; 01022 static const UChar kPatternExponent; 01023 static const UChar kPatternPlus; 01024 static const UChar kPatternMinus; 01025 static const UChar kPatternPadEscape; 01026 01034 static const UChar kCurrencySign; 01035 static const UChar kQuote; 01036 01037 protected: 01038 static const int32_t kDoubleIntegerDigits; 01039 static const int32_t kDoubleFractionDigits; 01040 }; 01041 01042 inline UnicodeString& 01043 DecimalFormat::format(const Formattable& obj, 01044 UnicodeString& result, 01045 UErrorCode& status) const { 01046 // Don't use Format:: - use immediate base class only, 01047 // in case immediate base modifies behavior later. 01048 return NumberFormat::format(obj, result, status); 01049 } 01050 01051 inline UnicodeString& 01052 DecimalFormat::format(double number, 01053 UnicodeString& output) const { 01054 return NumberFormat::format(number, output); 01055 } 01056 01057 inline UnicodeString& 01058 DecimalFormat::format(int32_t number, 01059 UnicodeString& output) const { 01060 return NumberFormat::format(number, output); 01061 } 01062 01063 inline UChar 01064 DecimalFormat::getPadCharacter() { 01065 return getPadCharacterString().charAt(0); 01066 } 01067 01068 inline void 01069 DecimalFormat::setPadCharacter(UChar padChar) { 01070 setPadCharacter(UnicodeString(padChar)); 01071 } 01072 01073 #endif // _DECIMFMT 01074 //eof