Main Page   Class Hierarchy   Compound List   File List   Header Files   Sources   Compound Members   File Members  

decimfmt.h

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

Generated at Mon Jun 5 12:53:02 2000 for ICU1.5 by doxygen 1.0.0 written by Dimitri van Heesch, © 1997-1999