decimfmt.h

00001 /*
00002 ********************************************************************************
00003 *   Copyright (C) 1997-2004, 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 
00029 #if !UCONFIG_NO_FORMATTING
00030 
00031 #include "unicode/dcfmtsym.h"
00032 #include "unicode/numfmt.h"
00033 #include "unicode/locid.h"
00034 
00035 U_NAMESPACE_BEGIN
00036 
00037 class DigitList;
00038 class ChoiceFormat;
00039 
00599 class U_I18N_API DecimalFormat: public NumberFormat {
00600 public:
00605     enum ERoundingMode {
00606         kRoundCeiling,  
00607         kRoundFloor,    
00608         kRoundDown,     
00609         kRoundUp,       
00610         kRoundHalfEven, 
00612         kRoundHalfDown, 
00614         kRoundHalfUp    
00616         // We don't support ROUND_UNNECESSARY
00617     };
00618 
00623     enum EPadPosition {
00624         kPadBeforePrefix,
00625         kPadAfterPrefix,
00626         kPadBeforeSuffix,
00627         kPadAfterSuffix
00628     };
00629 
00643     DecimalFormat(UErrorCode& status);
00644 
00659     DecimalFormat(const UnicodeString& pattern,
00660                   UErrorCode& status);
00661 
00680     DecimalFormat(  const UnicodeString& pattern,
00681                     DecimalFormatSymbols* symbolsToAdopt,
00682                     UErrorCode& status);
00683 
00703     DecimalFormat(  const UnicodeString& pattern,
00704                     DecimalFormatSymbols* symbolsToAdopt,
00705                     UParseError& parseError,
00706                     UErrorCode& status);
00724     DecimalFormat(  const UnicodeString& pattern,
00725                     const DecimalFormatSymbols& symbols,
00726                     UErrorCode& status);
00727 
00734     DecimalFormat(const DecimalFormat& source);
00735 
00742     DecimalFormat& operator=(const DecimalFormat& rhs);
00743 
00748     virtual ~DecimalFormat();
00749 
00757     virtual Format* clone(void) const;
00758 
00767     virtual UBool operator==(const Format& other) const;
00768 
00780     virtual UnicodeString& format(double number,
00781                                   UnicodeString& appendTo,
00782                                   FieldPosition& pos) const;
00794     virtual UnicodeString& format(int32_t number,
00795                                   UnicodeString& appendTo,
00796                                   FieldPosition& pos) const;
00808     virtual UnicodeString& format(int64_t number,
00809                                   UnicodeString& appendTo,
00810                                   FieldPosition& pos) const;
00811 
00824     virtual UnicodeString& format(const Formattable& obj,
00825                                   UnicodeString& appendTo,
00826                                   FieldPosition& pos,
00827                                   UErrorCode& status) const;
00828 
00840     UnicodeString& format(const Formattable& obj,
00841                           UnicodeString& appendTo,
00842                           UErrorCode& status) const;
00843 
00854     UnicodeString& format(double number,
00855                           UnicodeString& appendTo) const;
00856 
00868     UnicodeString& format(int32_t number,
00869                           UnicodeString& appendTo) const;
00870 
00882     UnicodeString& format(int64_t number,
00883                           UnicodeString& appendTo) const;
00903     virtual void parse(const UnicodeString& text,
00904                        Formattable& result,
00905                        ParsePosition& parsePosition) const;
00906 
00907     // Declare here again to get rid of function hiding problems.
00916     virtual void parse(const UnicodeString& text, 
00917                        Formattable& result, 
00918                        UErrorCode& status) const;
00919 
00939     virtual Formattable& parseCurrency(const UnicodeString& text,
00940                                        Formattable& result,
00941                                        ParsePosition& pos) const;
00942 
00950     virtual const DecimalFormatSymbols* getDecimalFormatSymbols(void) const;
00951 
00958     virtual void adoptDecimalFormatSymbols(DecimalFormatSymbols* symbolsToAdopt);
00959 
00966     virtual void setDecimalFormatSymbols(const DecimalFormatSymbols& symbols);
00967 
00968 
00977     UnicodeString& getPositivePrefix(UnicodeString& result) const;
00978 
00986     virtual void setPositivePrefix(const UnicodeString& newValue);
00987 
00996     UnicodeString& getNegativePrefix(UnicodeString& result) const;
00997 
01005     virtual void setNegativePrefix(const UnicodeString& newValue);
01006 
01015     UnicodeString& getPositiveSuffix(UnicodeString& result) const;
01016 
01024     virtual void setPositiveSuffix(const UnicodeString& newValue);
01025 
01034     UnicodeString& getNegativeSuffix(UnicodeString& result) const;
01035 
01043     virtual void setNegativeSuffix(const UnicodeString& newValue);
01044 
01055     int32_t getMultiplier(void) const;
01056 
01067     virtual void setMultiplier(int32_t newValue);
01068 
01078     virtual double getRoundingIncrement(void) const;
01079 
01090     virtual void setRoundingIncrement(double newValue);
01091 
01100     virtual ERoundingMode getRoundingMode(void) const;
01101 
01111     virtual void setRoundingMode(ERoundingMode roundingMode);
01112 
01124     virtual int32_t getFormatWidth(void) const;
01125 
01140     virtual void setFormatWidth(int32_t width);
01141 
01154     virtual UnicodeString getPadCharacterString() const;
01155 
01170     virtual void setPadCharacter(const UnicodeString &padChar);
01171 
01190     virtual EPadPosition getPadPosition(void) const;
01191 
01211     virtual void setPadPosition(EPadPosition padPos);
01212 
01223     virtual UBool isScientificNotation(void);
01224 
01240     virtual void setScientificNotation(UBool useScientific);
01241 
01252     virtual int8_t getMinimumExponentDigits(void) const;
01253 
01266     virtual void setMinimumExponentDigits(int8_t minExpDig);
01267 
01280     virtual UBool isExponentSignAlwaysShown(void);
01281 
01295     virtual void setExponentSignAlwaysShown(UBool expSignAlways);
01296 
01308     int32_t getGroupingSize(void) const;
01309 
01321     virtual void setGroupingSize(int32_t newValue);
01322 
01341     int32_t getSecondaryGroupingSize(void) const;
01342 
01354     virtual void setSecondaryGroupingSize(int32_t newValue);
01355 
01364     UBool isDecimalSeparatorAlwaysShown(void) const;
01365 
01374     virtual void setDecimalSeparatorAlwaysShown(UBool newValue);
01375 
01386     virtual UnicodeString& toPattern(UnicodeString& result) const;
01387 
01398     virtual UnicodeString& toLocalizedPattern(UnicodeString& result) const;
01399  
01429     virtual void applyPattern(const UnicodeString& pattern,
01430                              UParseError& parseError,
01431                              UErrorCode& status);
01440     virtual void applyPattern(const UnicodeString& pattern,
01441                              UErrorCode& status);
01442 
01473     virtual void applyLocalizedPattern(const UnicodeString& pattern,
01474                                        UParseError& parseError,
01475                                        UErrorCode& status);
01476 
01486     virtual void applyLocalizedPattern(const UnicodeString& pattern,
01487                                        UErrorCode& status);
01488 
01489 
01499     virtual void setMaximumIntegerDigits(int32_t newValue);
01500 
01510     virtual void setMinimumIntegerDigits(int32_t newValue);
01511 
01521     virtual void setMaximumFractionDigits(int32_t newValue);
01522 
01532     virtual void setMinimumFractionDigits(int32_t newValue);
01533 
01541     int32_t getMinimumSignificantDigits() const;
01542 
01550     int32_t getMaximumSignificantDigits() const;
01551 
01561     void setMinimumSignificantDigits(int32_t min);
01562 
01573     void setMaximumSignificantDigits(int32_t max);
01574 
01581     UBool areSignificantDigitsUsed() const;
01582 
01590     void setSignificantDigitsUsed(UBool useSignificantDigits);
01591 
01592  public:
01605     virtual void setCurrency(const UChar* theCurrency, UErrorCode& ec);
01606 
01612     virtual void setCurrency(const UChar* theCurrency);
01613 
01619     static const char fgNumberPatterns[];
01620 
01621 public:
01622 
01634     static UClassID U_EXPORT2 getStaticClassID(void);
01635 
01647     virtual UClassID getDynamicClassID(void) const;
01648 
01649 private:
01650     DecimalFormat(); // default constructor not implemented
01651 
01652     int32_t precision(UBool isIntegral) const;
01653 
01657     void construct(UErrorCode&               status,
01658                    UParseError&             parseErr,
01659                    const UnicodeString*     pattern = 0,
01660                    DecimalFormatSymbols*    symbolsToAdopt = 0
01661                    );
01662 
01671     UnicodeString& toPattern(UnicodeString& result, UBool localized) const;
01672 
01683     void applyPattern(const UnicodeString& pattern,
01684                             UBool localized,
01685                             UParseError& parseError,
01686                             UErrorCode& status);
01698     UnicodeString& subformat(UnicodeString& appendTo,
01699                              FieldPosition& fieldPosition,
01700                              DigitList& digits,
01701                              UBool         isInteger) const;
01702 
01703     void parse(const UnicodeString& text,
01704                Formattable& result,
01705                ParsePosition& pos,
01706                UBool parseCurrency) const;
01707 
01708     enum {
01709         fgStatusInfinite,
01710         fgStatusLength      // Leave last in list.
01711     } StatusFlags;
01712 
01713     UBool subparse(const UnicodeString& text, ParsePosition& parsePosition,
01714                    DigitList& digits, UBool* status,
01715                    UChar* currency) const;
01716 
01717     int32_t skipPadding(const UnicodeString& text, int32_t position) const;
01718 
01719     int32_t compareAffix(const UnicodeString& input,
01720                          int32_t pos,
01721                          UBool isNegative,
01722                          UBool isPrefix,
01723                          UChar* currency) const;
01724     
01725     static int32_t compareSimpleAffix(const UnicodeString& affix,
01726                                       const UnicodeString& input,
01727                                       int32_t pos);
01728     
01729     static int32_t skipRuleWhiteSpace(const UnicodeString& text, int32_t pos);
01730     
01731     static int32_t skipUWhiteSpace(const UnicodeString& text, int32_t pos);
01732     
01733     int32_t compareComplexAffix(const UnicodeString& affixPat,
01734                                 const UnicodeString& input,
01735                                 int32_t pos,
01736                                 UChar* currency) const;
01737 
01738     static int32_t match(const UnicodeString& text, int32_t pos, UChar32 ch);
01739 
01740     static int32_t match(const UnicodeString& text, int32_t pos, const UnicodeString& str);
01741 
01747     inline const UnicodeString &getConstSymbol(DecimalFormatSymbols::ENumberFormatSymbol symbol) const;
01748 
01749     int32_t appendAffix(UnicodeString& buf, double number,
01750                         UBool isNegative, UBool isPrefix) const;
01751 
01757     void appendAffixPattern(UnicodeString& appendTo, const UnicodeString& affix, 
01758                             UBool localized) const;
01759 
01760     void appendAffixPattern(UnicodeString& appendTo,
01761                             const UnicodeString* affixPattern,
01762                             const UnicodeString& expAffix, UBool localized) const;
01763 
01764     void expandAffix(const UnicodeString& pattern,
01765                      UnicodeString& affix,
01766                      double number,
01767                      UBool doFormat) const;
01768 
01769     void expandAffixes();
01770     
01771     static double round(double a, ERoundingMode mode, UBool isNegative);
01772 
01773     void addPadding(UnicodeString& appendTo,
01774                     FieldPosition& fieldPosition,
01775                     int32_t prefixLen, int32_t suffixLen) const;
01776 
01777     UBool isGroupingPosition(int32_t pos) const;
01778 
01779     void setCurrencyForSymbols();
01780 
01781     void setCurrencyForLocale(const char* locale, UErrorCode& ec);
01782 
01786     //static const int8_t fgMaxDigit; // The largest digit, in this case 9
01787 
01788     /*transient*/ //DigitList* fDigitList;
01789 
01790     UnicodeString           fPositivePrefix;
01791     UnicodeString           fPositiveSuffix;
01792     UnicodeString           fNegativePrefix;
01793     UnicodeString           fNegativeSuffix;
01794     UnicodeString*          fPosPrefixPattern;
01795     UnicodeString*          fPosSuffixPattern;
01796     UnicodeString*          fNegPrefixPattern;
01797     UnicodeString*          fNegSuffixPattern;
01798 
01804     ChoiceFormat*           fCurrencyChoice;
01805 
01806     int32_t                 fMultiplier;
01807     int32_t                 fGroupingSize;
01808     int32_t                 fGroupingSize2;
01809     UBool                   fDecimalSeparatorAlwaysShown;
01810     /*transient*/ UBool     fIsCurrencyFormat;
01811     DecimalFormatSymbols*   fSymbols;
01812 
01813     UBool                   fUseSignificantDigits;
01814     int32_t                 fMinSignificantDigits;
01815     int32_t                 fMaxSignificantDigits;
01816 
01817     UBool                   fUseExponentialNotation;
01818     int8_t                  fMinExponentDigits;
01819     UBool                   fExponentSignAlwaysShown;
01820 
01821     /* If fRoundingIncrement is NULL, there is no rounding.  Otherwise, round to
01822      * fRoundingIncrement.getDouble().  Since this operation may be expensive,
01823      * we cache the result in fRoundingDouble.  All methods that update
01824      * fRoundingIncrement also update fRoundingDouble. */
01825     DigitList*              fRoundingIncrement;
01826     /*transient*/ double    fRoundingDouble;
01827     ERoundingMode           fRoundingMode;
01828 
01829     UChar32                 fPad;
01830     int32_t                 fFormatWidth;
01831     EPadPosition            fPadPosition;
01832 
01833 protected:
01834 
01843     virtual void getEffectiveCurrency(UChar* result, UErrorCode& ec) const;
01844 
01848     static const int32_t  kDoubleIntegerDigits;
01852     static const int32_t  kDoubleFractionDigits;
01853 
01864     static const int32_t  kMaxScientificIntegerDigits;
01865 };
01866 
01867 inline UnicodeString&
01868 DecimalFormat::format(const Formattable& obj,
01869                       UnicodeString& appendTo,
01870                       UErrorCode& status) const {
01871     // Don't use Format:: - use immediate base class only,
01872     // in case immediate base modifies behavior later.
01873     return NumberFormat::format(obj, appendTo, status);
01874 }
01875 
01876 inline UnicodeString&
01877 DecimalFormat::format(double number,
01878                       UnicodeString& appendTo) const {
01879     FieldPosition pos(0);
01880     return format(number, appendTo, pos);
01881 }
01882 
01883 inline UnicodeString&
01884 DecimalFormat::format(int32_t number,
01885                       UnicodeString& appendTo) const {
01886     FieldPosition pos(0);
01887     return format((int64_t)number, appendTo, pos);
01888 }
01889 
01890 inline const UnicodeString &
01891 DecimalFormat::getConstSymbol(DecimalFormatSymbols::ENumberFormatSymbol symbol) const {
01892     return fSymbols->getConstSymbol(symbol);
01893 }
01894 
01895 U_NAMESPACE_END
01896 
01897 #endif /* #if !UCONFIG_NO_FORMATTING */
01898 
01899 #endif // _DECIMFMT
01900 //eof

Generated on Tue Nov 16 10:03:05 2004 for ICU 3.2 by  doxygen 1.3.9.1