decimfmt.h

Go to the documentation of this file.
00001 /*
00002 ********************************************************************************
00003 *   Copyright (C) 1997-2008, 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"
00033 #if !UCONFIG_NO_FORMATTING
00034 
00035 #include "unicode/dcfmtsym.h"
00036 #include "unicode/numfmt.h"
00037 #include "unicode/locid.h"
00038 
00039 U_NAMESPACE_BEGIN
00040 
00041 class DigitList;
00042 class ChoiceFormat;
00043 
00603 class U_I18N_API DecimalFormat: public NumberFormat {
00604 public:
00609     enum ERoundingMode {
00610         kRoundCeiling,  
00611         kRoundFloor,    
00612         kRoundDown,     
00613         kRoundUp,       
00614         kRoundHalfEven, 
00616         kRoundHalfDown, 
00618         kRoundHalfUp    
00620         // We don't support ROUND_UNNECESSARY
00621     };
00622 
00627     enum EPadPosition {
00628         kPadBeforePrefix,
00629         kPadAfterPrefix,
00630         kPadBeforeSuffix,
00631         kPadAfterSuffix
00632     };
00633 
00647     DecimalFormat(UErrorCode& status);
00648 
00663     DecimalFormat(const UnicodeString& pattern,
00664                   UErrorCode& status);
00665 
00684     DecimalFormat(  const UnicodeString& pattern,
00685                     DecimalFormatSymbols* symbolsToAdopt,
00686                     UErrorCode& status);
00687 
00707     DecimalFormat(  const UnicodeString& pattern,
00708                     DecimalFormatSymbols* symbolsToAdopt,
00709                     UParseError& parseError,
00710                     UErrorCode& status);
00728     DecimalFormat(  const UnicodeString& pattern,
00729                     const DecimalFormatSymbols& symbols,
00730                     UErrorCode& status);
00731 
00738     DecimalFormat(const DecimalFormat& source);
00739 
00746     DecimalFormat& operator=(const DecimalFormat& rhs);
00747 
00752     virtual ~DecimalFormat();
00753 
00761     virtual Format* clone(void) const;
00762 
00771     virtual UBool operator==(const Format& other) const;
00772 
00784     virtual UnicodeString& format(double number,
00785                                   UnicodeString& appendTo,
00786                                   FieldPosition& pos) const;
00798     virtual UnicodeString& format(int32_t number,
00799                                   UnicodeString& appendTo,
00800                                   FieldPosition& pos) const;
00812     virtual UnicodeString& format(int64_t number,
00813                                   UnicodeString& appendTo,
00814                                   FieldPosition& pos) const;
00815 
00828     virtual UnicodeString& format(const Formattable& obj,
00829                                   UnicodeString& appendTo,
00830                                   FieldPosition& pos,
00831                                   UErrorCode& status) const;
00832 
00844     UnicodeString& format(const Formattable& obj,
00845                           UnicodeString& appendTo,
00846                           UErrorCode& status) const;
00847 
00858     UnicodeString& format(double number,
00859                           UnicodeString& appendTo) const;
00860 
00872     UnicodeString& format(int32_t number,
00873                           UnicodeString& appendTo) const;
00874 
00886     UnicodeString& format(int64_t number,
00887                           UnicodeString& appendTo) const;
00907     virtual void parse(const UnicodeString& text,
00908                        Formattable& result,
00909                        ParsePosition& parsePosition) const;
00910 
00911     // Declare here again to get rid of function hiding problems.
00920     virtual void parse(const UnicodeString& text, 
00921                        Formattable& result, 
00922                        UErrorCode& status) const;
00923 
00943     virtual Formattable& parseCurrency(const UnicodeString& text,
00944                                        Formattable& result,
00945                                        ParsePosition& pos) const;
00946 
00954     virtual const DecimalFormatSymbols* getDecimalFormatSymbols(void) const;
00955 
00962     virtual void adoptDecimalFormatSymbols(DecimalFormatSymbols* symbolsToAdopt);
00963 
00970     virtual void setDecimalFormatSymbols(const DecimalFormatSymbols& symbols);
00971 
00972 
00981     UnicodeString& getPositivePrefix(UnicodeString& result) const;
00982 
00990     virtual void setPositivePrefix(const UnicodeString& newValue);
00991 
01000     UnicodeString& getNegativePrefix(UnicodeString& result) const;
01001 
01009     virtual void setNegativePrefix(const UnicodeString& newValue);
01010 
01019     UnicodeString& getPositiveSuffix(UnicodeString& result) const;
01020 
01028     virtual void setPositiveSuffix(const UnicodeString& newValue);
01029 
01038     UnicodeString& getNegativeSuffix(UnicodeString& result) const;
01039 
01047     virtual void setNegativeSuffix(const UnicodeString& newValue);
01048 
01059     int32_t getMultiplier(void) const;
01060 
01071     virtual void setMultiplier(int32_t newValue);
01072 
01082     virtual double getRoundingIncrement(void) const;
01083 
01094     virtual void setRoundingIncrement(double newValue);
01095 
01104     virtual ERoundingMode getRoundingMode(void) const;
01105 
01115     virtual void setRoundingMode(ERoundingMode roundingMode);
01116 
01128     virtual int32_t getFormatWidth(void) const;
01129 
01144     virtual void setFormatWidth(int32_t width);
01145 
01158     virtual UnicodeString getPadCharacterString() const;
01159 
01174     virtual void setPadCharacter(const UnicodeString &padChar);
01175 
01191     virtual EPadPosition getPadPosition(void) const;
01192 
01209     virtual void setPadPosition(EPadPosition padPos);
01210 
01221     virtual UBool isScientificNotation(void);
01222 
01238     virtual void setScientificNotation(UBool useScientific);
01239 
01250     virtual int8_t getMinimumExponentDigits(void) const;
01251 
01264     virtual void setMinimumExponentDigits(int8_t minExpDig);
01265 
01278     virtual UBool isExponentSignAlwaysShown(void);
01279 
01293     virtual void setExponentSignAlwaysShown(UBool expSignAlways);
01294 
01306     int32_t getGroupingSize(void) const;
01307 
01319     virtual void setGroupingSize(int32_t newValue);
01320 
01339     int32_t getSecondaryGroupingSize(void) const;
01340 
01352     virtual void setSecondaryGroupingSize(int32_t newValue);
01353 
01362     UBool isDecimalSeparatorAlwaysShown(void) const;
01363 
01372     virtual void setDecimalSeparatorAlwaysShown(UBool newValue);
01373 
01384     virtual UnicodeString& toPattern(UnicodeString& result) const;
01385 
01396     virtual UnicodeString& toLocalizedPattern(UnicodeString& result) const;
01397  
01427     virtual void applyPattern(const UnicodeString& pattern,
01428                              UParseError& parseError,
01429                              UErrorCode& status);
01438     virtual void applyPattern(const UnicodeString& pattern,
01439                              UErrorCode& status);
01440 
01471     virtual void applyLocalizedPattern(const UnicodeString& pattern,
01472                                        UParseError& parseError,
01473                                        UErrorCode& status);
01474 
01484     virtual void applyLocalizedPattern(const UnicodeString& pattern,
01485                                        UErrorCode& status);
01486 
01487 
01497     virtual void setMaximumIntegerDigits(int32_t newValue);
01498 
01508     virtual void setMinimumIntegerDigits(int32_t newValue);
01509 
01519     virtual void setMaximumFractionDigits(int32_t newValue);
01520 
01530     virtual void setMinimumFractionDigits(int32_t newValue);
01531 
01539     int32_t getMinimumSignificantDigits() const;
01540 
01548     int32_t getMaximumSignificantDigits() const;
01549 
01559     void setMinimumSignificantDigits(int32_t min);
01560 
01571     void setMaximumSignificantDigits(int32_t max);
01572 
01579     UBool areSignificantDigitsUsed() const;
01580 
01588     void setSignificantDigitsUsed(UBool useSignificantDigits);
01589 
01590  public:
01603     virtual void setCurrency(const UChar* theCurrency, UErrorCode& ec);
01604 
01610     virtual void setCurrency(const UChar* theCurrency);
01611 
01617     static const char fgNumberPatterns[];
01618 
01619 public:
01620 
01632     static UClassID U_EXPORT2 getStaticClassID(void);
01633 
01645     virtual UClassID getDynamicClassID(void) const;
01646 
01647 private:
01648     DecimalFormat(); // default constructor not implemented
01649 
01650     int32_t precision(UBool isIntegral) const;
01651 
01655     void construct(UErrorCode&               status,
01656                    UParseError&             parseErr,
01657                    const UnicodeString*     pattern = 0,
01658                    DecimalFormatSymbols*    symbolsToAdopt = 0
01659                    );
01660 
01669     UnicodeString& toPattern(UnicodeString& result, UBool localized) const;
01670 
01681     void applyPattern(const UnicodeString& pattern,
01682                             UBool localized,
01683                             UParseError& parseError,
01684                             UErrorCode& status);
01696     UnicodeString& subformat(UnicodeString& appendTo,
01697                              FieldPosition& fieldPosition,
01698                              DigitList& digits,
01699                              UBool         isInteger) const;
01700 
01701     void parse(const UnicodeString& text,
01702                Formattable& result,
01703                ParsePosition& pos,
01704                UBool parseCurrency) const;
01705 
01706     enum {
01707         fgStatusInfinite,
01708         fgStatusLength      // Leave last in list.
01709     } StatusFlags;
01710 
01711     UBool subparse(const UnicodeString& text, ParsePosition& parsePosition,
01712                    DigitList& digits, UBool* status,
01713                    UChar* currency) const;
01714 
01715     int32_t skipPadding(const UnicodeString& text, int32_t position) const;
01716 
01717     int32_t compareAffix(const UnicodeString& input,
01718                          int32_t pos,
01719                          UBool isNegative,
01720                          UBool isPrefix,
01721                          UChar* currency) const;
01722     
01723     static int32_t compareSimpleAffix(const UnicodeString& affix,
01724                                       const UnicodeString& input,
01725                                       int32_t pos);
01726     
01727     static int32_t skipRuleWhiteSpace(const UnicodeString& text, int32_t pos);
01728     
01729     static int32_t skipUWhiteSpace(const UnicodeString& text, int32_t pos);
01730     
01731     int32_t compareComplexAffix(const UnicodeString& affixPat,
01732                                 const UnicodeString& input,
01733                                 int32_t pos,
01734                                 UChar* currency) const;
01735 
01736     static int32_t match(const UnicodeString& text, int32_t pos, UChar32 ch);
01737 
01738     static int32_t match(const UnicodeString& text, int32_t pos, const UnicodeString& str);
01739 
01745     inline const UnicodeString &getConstSymbol(DecimalFormatSymbols::ENumberFormatSymbol symbol) const;
01746 
01747     int32_t appendAffix(UnicodeString& buf, double number,
01748                         UBool isNegative, UBool isPrefix) const;
01749 
01755     void appendAffixPattern(UnicodeString& appendTo, const UnicodeString& affix, 
01756                             UBool localized) const;
01757 
01758     void appendAffixPattern(UnicodeString& appendTo,
01759                             const UnicodeString* affixPattern,
01760                             const UnicodeString& expAffix, UBool localized) const;
01761 
01762     void expandAffix(const UnicodeString& pattern,
01763                      UnicodeString& affix,
01764                      double number,
01765                      UBool doFormat) const;
01766 
01767     void expandAffixes();
01768     
01769     static double round(double a, ERoundingMode mode, UBool isNegative);
01770 
01771     void addPadding(UnicodeString& appendTo,
01772                     FieldPosition& fieldPosition,
01773                     int32_t prefixLen, int32_t suffixLen) const;
01774 
01775     UBool isGroupingPosition(int32_t pos) const;
01776 
01777     void setCurrencyForSymbols();
01778 
01782     //static const int8_t fgMaxDigit; // The largest digit, in this case 9
01783 
01784     /*transient*/ //DigitList* fDigitList;
01785 
01786     UnicodeString           fPositivePrefix;
01787     UnicodeString           fPositiveSuffix;
01788     UnicodeString           fNegativePrefix;
01789     UnicodeString           fNegativeSuffix;
01790     UnicodeString*          fPosPrefixPattern;
01791     UnicodeString*          fPosSuffixPattern;
01792     UnicodeString*          fNegPrefixPattern;
01793     UnicodeString*          fNegSuffixPattern;
01794 
01800     ChoiceFormat*           fCurrencyChoice;
01801 
01802     int32_t                 fMultiplier;
01803     int32_t                 fGroupingSize;
01804     int32_t                 fGroupingSize2;
01805     UBool                   fDecimalSeparatorAlwaysShown;
01806     /*transient*/ UBool     fIsCurrencyFormat;
01807     DecimalFormatSymbols*   fSymbols;
01808 
01809     UBool                   fUseSignificantDigits;
01810     int32_t                 fMinSignificantDigits;
01811     int32_t                 fMaxSignificantDigits;
01812 
01813     UBool                   fUseExponentialNotation;
01814     int8_t                  fMinExponentDigits;
01815     UBool                   fExponentSignAlwaysShown;
01816 
01817     /* If fRoundingIncrement is NULL, there is no rounding.  Otherwise, round to
01818      * fRoundingIncrement.getDouble().  Since this operation may be expensive,
01819      * we cache the result in fRoundingDouble.  All methods that update
01820      * fRoundingIncrement also update fRoundingDouble. */
01821     DigitList*              fRoundingIncrement;
01822     /*transient*/ double    fRoundingDouble;
01823     ERoundingMode           fRoundingMode;
01824 
01825     UChar32                 fPad;
01826     int32_t                 fFormatWidth;
01827     EPadPosition            fPadPosition;
01828 
01829 protected:
01830 
01839     virtual void getEffectiveCurrency(UChar* result, UErrorCode& ec) const;
01840 
01844     static const int32_t  kDoubleIntegerDigits;
01848     static const int32_t  kDoubleFractionDigits;
01849 
01860     static const int32_t  kMaxScientificIntegerDigits;
01861 };
01862 
01863 inline UnicodeString&
01864 DecimalFormat::format(const Formattable& obj,
01865                       UnicodeString& appendTo,
01866                       UErrorCode& status) const {
01867     // Don't use Format:: - use immediate base class only,
01868     // in case immediate base modifies behavior later.
01869     return NumberFormat::format(obj, appendTo, status);
01870 }
01871 
01872 inline UnicodeString&
01873 DecimalFormat::format(double number,
01874                       UnicodeString& appendTo) const {
01875     FieldPosition pos(0);
01876     return format(number, appendTo, pos);
01877 }
01878 
01879 inline UnicodeString&
01880 DecimalFormat::format(int32_t number,
01881                       UnicodeString& appendTo) const {
01882     FieldPosition pos(0);
01883     return format((int64_t)number, appendTo, pos);
01884 }
01885 
01886 inline const UnicodeString &
01887 DecimalFormat::getConstSymbol(DecimalFormatSymbols::ENumberFormatSymbol symbol) const {
01888     return fSymbols->getConstSymbol(symbol);
01889 }
01890 
01891 U_NAMESPACE_END
01892 
01893 #endif /* #if !UCONFIG_NO_FORMATTING */
01894 
01895 #endif // _DECIMFMT
01896 //eof

Generated on 17 Sep 2013 for ICU 4.0.1 by  doxygen 1.4.7