Main Page   Class Hierarchy   Alphabetical List   Data Structures   File List   Data Fields   Globals  

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 Mon Mar 4 21:29:21 2002 for ICU 2.0 by doxygen1.2.14 written by Dimitri van Heesch, © 1997-2002