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 
00172 class U_I18N_API DecimalFormat: public NumberFormat {
00173 public:
00174     enum ERoundingMode {
00175         kRoundCeiling,
00176         kRoundFloor,
00177         kRoundDown,
00178         kRoundUp,
00179         kRoundHalfEven,
00180         kRoundHalfDown,
00181         kRoundHalfUp
00182         // We don't support ROUND_UNNECESSARY
00183     };
00184 
00185     enum EPadPosition {
00186         kPadBeforePrefix,
00187         kPadAfterPrefix,
00188         kPadBeforeSuffix,
00189         kPadAfterSuffix
00190     };
00191 
00205     DecimalFormat(UErrorCode& status);
00206 
00221     DecimalFormat(const UnicodeString& pattern,
00222                   UErrorCode& status);
00223 
00242     DecimalFormat(  const UnicodeString& pattern,
00243                     DecimalFormatSymbols* symbolsToAdopt,
00244                     UErrorCode& status);
00245 
00263     DecimalFormat(  const UnicodeString& pattern,
00264                     const DecimalFormatSymbols& symbols,
00265                     UErrorCode& status);
00266 
00271     DecimalFormat(const DecimalFormat& source);
00272 
00277     DecimalFormat& operator=(const DecimalFormat& rhs);
00278 
00283     virtual ~DecimalFormat();
00284 
00290     virtual Format* clone(void) const;
00291 
00297     virtual UBool operator==(const Format& other) const;
00298 
00310     virtual UnicodeString& format(double number,
00311                                   UnicodeString& toAppendTo,
00312                                   FieldPosition& pos) const;
00313     virtual UnicodeString& format(int32_t number,
00314                                   UnicodeString& toAppendTo,
00315                                   FieldPosition& pos) const;
00316     virtual UnicodeString& format(const Formattable& obj,
00317                                   UnicodeString& toAppendTo,
00318                                   FieldPosition& pos,
00319                                   UErrorCode& status) const;
00320 
00325     UnicodeString& format(const Formattable& obj,
00326                           UnicodeString& result,
00327                           UErrorCode& status) const;
00328 
00333     UnicodeString& format(double number,
00334                           UnicodeString& output) const;
00335 
00340     UnicodeString& format(int32_t number,
00341                           UnicodeString& output) const;
00342 
00357     virtual void parse(const UnicodeString& text,
00358                        Formattable& result,
00359                        ParsePosition& parsePosition) const;
00360 
00361     // Declare here again to get rid of function hiding problems.
00362     virtual void parse(const UnicodeString& text, 
00363                        Formattable& result, 
00364                        UErrorCode& error) const;
00365 
00373     virtual const DecimalFormatSymbols* getDecimalFormatSymbols(void) const;
00374 
00381     virtual void adoptDecimalFormatSymbols(DecimalFormatSymbols* symbolsToAdopt);
00382 
00389     virtual void setDecimalFormatSymbols(const DecimalFormatSymbols& symbols);
00390 
00391 
00398     UnicodeString& getPositivePrefix(UnicodeString& result) const;
00399 
00406     virtual void setPositivePrefix(const UnicodeString& newValue);
00407 
00414     UnicodeString& getNegativePrefix(UnicodeString& result) const;
00415 
00422     virtual void setNegativePrefix(const UnicodeString& newValue);
00423 
00430     UnicodeString& getPositiveSuffix(UnicodeString& result) const;
00431 
00438     virtual void setPositiveSuffix(const UnicodeString& newValue);
00439 
00446     UnicodeString& getNegativeSuffix(UnicodeString& result) const;
00447 
00454     virtual void setNegativeSuffix(const UnicodeString& newValue);
00455 
00465     int32_t getMultiplier(void) const;
00466 
00476     virtual void setMultiplier(int32_t newValue);
00477 
00487     virtual double getRoundingIncrement(void);
00488 
00499     virtual void setRoundingIncrement(double newValue);
00500 
00509     virtual ERoundingMode getRoundingMode(void);
00510 
00520     virtual void setRoundingMode(ERoundingMode roundingMode);
00521 
00532     virtual int32_t getFormatWidth(void);
00533 
00547     virtual void setFormatWidth(int32_t width);
00548 
00559     inline UChar getPadCharacter(void);
00560 
00574     virtual UnicodeString getPadCharacterString();
00575 
00587     inline void setPadCharacter(UChar padChar);
00588 
00603     virtual void setPadCharacter(UnicodeString padChar);
00604 
00623     virtual EPadPosition getPadPosition(void);
00624 
00645     virtual void setPadPosition(EPadPosition padPos);
00646 
00657     virtual UBool isScientificNotation(void);
00658 
00670     virtual void setScientificNotation(UBool useScientific);
00671 
00682     virtual int8_t getMinimumExponentDigits(void);
00683 
00696     virtual void setMinimumExponentDigits(int8_t minExpDig);
00697 
00710     virtual UBool isExponentSignAlwaysShown(void);
00711 
00725     virtual void setExponentSignAlwaysShown(UBool expSignAlways);
00726 
00736     int32_t getGroupingSize(void) const;
00737 
00747     virtual void setGroupingSize(int32_t newValue);
00748 
00766     int32_t getSecondaryGroupingSize(void) const;
00767 
00776     virtual void setSecondaryGroupingSize(int32_t newValue);
00777 
00785     UBool isDecimalSeparatorAlwaysShown(void) const;
00786 
00794     virtual void setDecimalSeparatorAlwaysShown(UBool newValue);
00795 
00802     virtual UnicodeString& toPattern(UnicodeString& result) const;
00803 
00811     virtual UnicodeString& toLocalizedPattern(UnicodeString& result) const;
00812  
00840     virtual void applyPattern(const UnicodeString& pattern,
00841                               UErrorCode& status);
00842 
00871     virtual void applyLocalizedPattern(const UnicodeString& pattern,
00872                                        UErrorCode& status);
00873 
00880     virtual void setMaximumIntegerDigits(int32_t newValue);
00881 
00888     virtual void setMinimumIntegerDigits(int32_t newValue);
00889 
00896     virtual void setMaximumFractionDigits(int32_t newValue);
00897 
00904     virtual void setMinimumFractionDigits(int32_t newValue);
00905 
00911     static const char *fgNumberPatterns;
00912 
00913 public:
00914 
00926     static UClassID getStaticClassID(void) { return (UClassID)&fgClassID; }
00927 
00939     virtual UClassID getDynamicClassID(void) const { return getStaticClassID(); }
00940 
00941 private:
00942     static char fgClassID;
00943 
00947     void construct(UErrorCode&               status,
00948                    const UnicodeString*     pattern = 0,
00949                    DecimalFormatSymbols*    symbolsToAdopt = 0,
00950                    const Locale&            locale = Locale::getDefault());
00951 
00955     UnicodeString& toPattern(UnicodeString& result, UBool localized) const;
00956 
00965     void applyPattern(const UnicodeString& pattern,
00966                             UBool localized,
00967                             UErrorCode& status);
00968 
00972     UnicodeString& subformat(UnicodeString& result,
00973                              FieldPosition& fieldPosition,
00974                              UBool         isNegative,
00975                              UBool         isInteger) const;
00976 
00977     static const int32_t fgStatusInfinite;
00978     static const int32_t fgStatusPositive;
00979     static const int32_t fgStatusLength;
00980 
00993     UBool subparse(const UnicodeString& text, ParsePosition& parsePosition,
00994                     DigitList& digits, UBool isExponent,
00995                     UBool* status) const;
00996 
01002     void appendAffix(UnicodeString& buffer, const UnicodeString& affix, 
01003                      UBool localized) const;
01004 
01005     void appendAffix(UnicodeString& buffer,
01006                      const UnicodeString* affixPattern,
01007                      const UnicodeString& expAffix, UBool localized) const;
01008 
01009     void expandAffix(const UnicodeString& pattern,
01010                      UnicodeString& affix) const;
01011 
01012     void expandAffixes(void);
01013     
01014     static double round(double a, ERoundingMode mode, UBool isNegative);
01015 
01016     void addPadding(UnicodeString& result, UBool hasAffixes,
01017                     UBool isNegative) const;
01018 
01019     UBool isGroupingPosition(int32_t pos) const;
01020 
01024     static const int8_t fgMaxDigit; // The largest digit, in this case 9
01025 
01026     /*transient*/ DigitList* fDigitList;
01027 
01028     UnicodeString           fPositivePrefix;
01029     UnicodeString           fPositiveSuffix;
01030     UnicodeString           fNegativePrefix;
01031     UnicodeString           fNegativeSuffix;
01032     UnicodeString*          fPosPrefixPattern;
01033     UnicodeString*          fPosSuffixPattern;
01034     UnicodeString*          fNegPrefixPattern;
01035     UnicodeString*          fNegSuffixPattern;
01036     int32_t                 fMultiplier;
01037     int32_t                 fGroupingSize;
01038     int32_t                 fGroupingSize2;
01039     UBool                  fDecimalSeparatorAlwaysShown;
01040     /*transient*/ UBool    fIsCurrencyFormat;
01041     DecimalFormatSymbols*   fSymbols;
01042 
01043     UBool                  fUseExponentialNotation;
01044     int8_t                  fMinExponentDigits;
01045     UBool                  fExponentSignAlwaysShown;
01046 
01047     /* If fRoundingIncrement is NULL, there is no rounding.  Otherwise, round to
01048      * fRoundingIncrement.getDouble().  Since this operation may be expensive,
01049      * we cache the result in fRoundingDouble.  All methods that update
01050      * fRoundingIncrement also update fRoundingDouble. */
01051     DigitList*              fRoundingIncrement;
01052     /*transient*/ double    fRoundingDouble;
01053     ERoundingMode           fRoundingMode;
01054 
01055     UChar                   fPad;
01056     int32_t                 fFormatWidth;
01057     EPadPosition            fPadPosition;
01058 
01059     // Constants for characters used in programmatic (unlocalized) patterns.
01060     static const UChar    kPatternZeroDigit;
01061     static const UChar    kPatternGroupingSeparator;
01062     static const UChar    kPatternDecimalSeparator;
01063     static const UChar    kPatternPerMill;
01064     static const UChar    kPatternPercent;
01065     static const UChar    kPatternDigit;
01066     static const UChar    kPatternSeparator;
01067     static const UChar    kPatternExponent;
01068     static const UChar    kPatternPlus;
01069     static const UChar    kPatternMinus;
01070     static const UChar    kPatternPadEscape;
01071 
01079     static const UChar    kCurrencySign;
01080     static const UChar    kQuote;
01081 
01082 protected:
01083     static const int32_t  kDoubleIntegerDigits;
01084     static const int32_t  kDoubleFractionDigits;
01085 };
01086 
01087 inline UnicodeString&
01088 DecimalFormat::format(const Formattable& obj,
01089                       UnicodeString& result,
01090                       UErrorCode& status) const {
01091     // Don't use Format:: - use immediate base class only,
01092     // in case immediate base modifies behavior later.
01093     return NumberFormat::format(obj, result, status);
01094 }
01095 
01096 inline UnicodeString&
01097 DecimalFormat::format(double number,
01098                       UnicodeString& output) const {
01099     return NumberFormat::format(number, output);
01100 }
01101 
01102 inline UnicodeString&
01103 DecimalFormat::format(int32_t number,
01104                       UnicodeString& output) const {
01105     return NumberFormat::format(number, output);
01106 }
01107 
01108 inline UChar
01109 DecimalFormat::getPadCharacter() {
01110     return getPadCharacterString().charAt(0);
01111 }
01112 
01113 inline void
01114 DecimalFormat::setPadCharacter(UChar padChar) {
01115     setPadCharacter(UnicodeString(padChar));
01116 }
01117 
01118 #endif // _DECIMFMT
01119 //eof

Generated at Wed Aug 16 16:05:33 2000 for ICU1.6 by doxygen 1.0.0 written by Dimitri van Heesch, © 1997-1999