Main Page   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members  

decimfmt.h

Go to the documentation of this file.
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 
00178 class U_I18N_API DecimalFormat: public NumberFormat {
00179 public:
00180     enum ERoundingMode {
00181         kRoundCeiling,
00182         kRoundFloor,
00183         kRoundDown,
00184         kRoundUp,
00185         kRoundHalfEven,
00186         kRoundHalfDown,
00187         kRoundHalfUp
00188         // We don't support ROUND_UNNECESSARY
00189     };
00190 
00191     enum EPadPosition {
00192         kPadBeforePrefix,
00193         kPadAfterPrefix,
00194         kPadBeforeSuffix,
00195         kPadAfterSuffix
00196     };
00197 
00211     DecimalFormat(UErrorCode& status);
00212 
00227     DecimalFormat(const UnicodeString& pattern,
00228                   UErrorCode& status);
00229 
00248     DecimalFormat(  const UnicodeString& pattern,
00249                     DecimalFormatSymbols* symbolsToAdopt,
00250                     UErrorCode& status);
00251 
00269     DecimalFormat(  const UnicodeString& pattern,
00270                     const DecimalFormatSymbols& symbols,
00271                     UErrorCode& status);
00272 
00277     DecimalFormat(const DecimalFormat& source);
00278 
00283     DecimalFormat& operator=(const DecimalFormat& rhs);
00284 
00289     virtual ~DecimalFormat();
00290 
00296     virtual Format* clone(void) const;
00297 
00303     virtual UBool operator==(const Format& other) const;
00304 
00316     virtual UnicodeString& format(double number,
00317                                   UnicodeString& toAppendTo,
00318                                   FieldPosition& pos) const;
00319     virtual UnicodeString& format(int32_t number,
00320                                   UnicodeString& toAppendTo,
00321                                   FieldPosition& pos) const;
00322     virtual UnicodeString& format(const Formattable& obj,
00323                                   UnicodeString& toAppendTo,
00324                                   FieldPosition& pos,
00325                                   UErrorCode& status) const;
00326 
00331     UnicodeString& format(const Formattable& obj,
00332                           UnicodeString& result,
00333                           UErrorCode& status) const;
00334 
00339     UnicodeString& format(double number,
00340                           UnicodeString& output) const;
00341 
00346     UnicodeString& format(int32_t number,
00347                           UnicodeString& output) const;
00348 
00368     virtual void parse(const UnicodeString& text,
00369                        Formattable& result,
00370                        ParsePosition& parsePosition) const;
00371 
00372     // Declare here again to get rid of function hiding problems.
00373     virtual void parse(const UnicodeString& text, 
00374                        Formattable& result, 
00375                        UErrorCode& error) const;
00376 
00384     virtual const DecimalFormatSymbols* getDecimalFormatSymbols(void) const;
00385 
00392     virtual void adoptDecimalFormatSymbols(DecimalFormatSymbols* symbolsToAdopt);
00393 
00400     virtual void setDecimalFormatSymbols(const DecimalFormatSymbols& symbols);
00401 
00402 
00409     UnicodeString& getPositivePrefix(UnicodeString& result) const;
00410 
00417     virtual void setPositivePrefix(const UnicodeString& newValue);
00418 
00425     UnicodeString& getNegativePrefix(UnicodeString& result) const;
00426 
00433     virtual void setNegativePrefix(const UnicodeString& newValue);
00434 
00441     UnicodeString& getPositiveSuffix(UnicodeString& result) const;
00442 
00449     virtual void setPositiveSuffix(const UnicodeString& newValue);
00450 
00457     UnicodeString& getNegativeSuffix(UnicodeString& result) const;
00458 
00465     virtual void setNegativeSuffix(const UnicodeString& newValue);
00466 
00476     int32_t getMultiplier(void) const;
00477 
00486     virtual void setMultiplier(int32_t newValue);
00487 
00497     virtual double getRoundingIncrement(void);
00498 
00509     virtual void setRoundingIncrement(double newValue);
00510 
00519     virtual ERoundingMode getRoundingMode(void);
00520 
00530     virtual void setRoundingMode(ERoundingMode roundingMode);
00531 
00542     virtual int32_t getFormatWidth(void);
00543 
00557     virtual void setFormatWidth(int32_t width);
00558 
00569     inline UChar getPadCharacter(void);
00570 
00584     virtual UnicodeString getPadCharacterString();
00585 
00597     inline void setPadCharacter(UChar padChar);
00598 
00613     virtual void setPadCharacter(UnicodeString padChar);
00614 
00633     virtual EPadPosition getPadPosition(void);
00634 
00655     virtual void setPadPosition(EPadPosition padPos);
00656 
00667     virtual UBool isScientificNotation(void);
00668 
00680     virtual void setScientificNotation(UBool useScientific);
00681 
00692     virtual int8_t getMinimumExponentDigits(void);
00693 
00706     virtual void setMinimumExponentDigits(int8_t minExpDig);
00707 
00720     virtual UBool isExponentSignAlwaysShown(void);
00721 
00735     virtual void setExponentSignAlwaysShown(UBool expSignAlways);
00736 
00746     int32_t getGroupingSize(void) const;
00747 
00757     virtual void setGroupingSize(int32_t newValue);
00758 
00776     int32_t getSecondaryGroupingSize(void) const;
00777 
00786     virtual void setSecondaryGroupingSize(int32_t newValue);
00787 
00795     UBool isDecimalSeparatorAlwaysShown(void) const;
00796 
00804     virtual void setDecimalSeparatorAlwaysShown(UBool newValue);
00805 
00812     virtual UnicodeString& toPattern(UnicodeString& result) const;
00813 
00821     virtual UnicodeString& toLocalizedPattern(UnicodeString& result) const;
00822  
00850     virtual void applyPattern(const UnicodeString& pattern,
00851                               UErrorCode& status);
00852 
00881     virtual void applyLocalizedPattern(const UnicodeString& pattern,
00882                                        UErrorCode& status);
00883 
00890     virtual void setMaximumIntegerDigits(int32_t newValue);
00891 
00898     virtual void setMinimumIntegerDigits(int32_t newValue);
00899 
00906     virtual void setMaximumFractionDigits(int32_t newValue);
00907 
00914     virtual void setMinimumFractionDigits(int32_t newValue);
00915 
00921     static const char *fgNumberPatterns;
00922 
00923 public:
00924 
00936     static UClassID getStaticClassID(void) { return (UClassID)&fgClassID; }
00937 
00949     virtual UClassID getDynamicClassID(void) const { return getStaticClassID(); }
00950 
00951 private:
00952     static char fgClassID;
00953 
00957     void construct(UErrorCode&               status,
00958                    const UnicodeString*     pattern = 0,
00959                    DecimalFormatSymbols*    symbolsToAdopt = 0,
00960                    const Locale&            locale = Locale::getDefault());
00961 
00965     UnicodeString& toPattern(UnicodeString& result, UBool localized) const;
00966 
00975     void applyPattern(const UnicodeString& pattern,
00976                             UBool localized,
00977                             UErrorCode& status);
00978 
00982     UnicodeString& subformat(UnicodeString& result,
00983                              FieldPosition& fieldPosition,
00984                              DigitList& digits,
00985                              UBool         isInteger) const;
00986 
00987     enum {
00988         fgStatusInfinite,
00989         fgStatusLength      // Leave last in list.
00990     } StatusFlags;
00991 
01004     UBool subparse(const UnicodeString& text, ParsePosition& parsePosition,
01005                     DigitList& digits, UBool* status) const;
01006 
01012     void appendAffix(UnicodeString& buffer, const UnicodeString& affix, 
01013                      UBool localized) const;
01014 
01015     void appendAffix(UnicodeString& buffer,
01016                      const UnicodeString* affixPattern,
01017                      const UnicodeString& expAffix, UBool localized) const;
01018 
01019     void expandAffix(const UnicodeString& pattern,
01020                      UnicodeString& affix) const;
01021 
01022     void expandAffixes(void);
01023     
01024     static double round(double a, ERoundingMode mode, UBool isNegative);
01025 
01026     void addPadding(UnicodeString& result, UBool hasAffixes,
01027                     UBool isNegative) const;
01028 
01029     UBool isGroupingPosition(int32_t pos) const;
01030 
01034     //static const int8_t fgMaxDigit; // The largest digit, in this case 9
01035 
01036     /*transient*/ //DigitList* fDigitList;
01037 
01038     UnicodeString           fPositivePrefix;
01039     UnicodeString           fPositiveSuffix;
01040     UnicodeString           fNegativePrefix;
01041     UnicodeString           fNegativeSuffix;
01042     UnicodeString*          fPosPrefixPattern;
01043     UnicodeString*          fPosSuffixPattern;
01044     UnicodeString*          fNegPrefixPattern;
01045     UnicodeString*          fNegSuffixPattern;
01046     int32_t                 fMultiplier;
01047     int32_t                 fGroupingSize;
01048     int32_t                 fGroupingSize2;
01049     UBool                  fDecimalSeparatorAlwaysShown;
01050     /*transient*/ UBool    fIsCurrencyFormat;
01051     /* @deprecated */ DecimalFormatSymbols*   fSymbols;
01052 
01053     UBool                  fUseExponentialNotation;
01054     int8_t                  fMinExponentDigits;
01055     UBool                  fExponentSignAlwaysShown;
01056 
01057     /* If fRoundingIncrement is NULL, there is no rounding.  Otherwise, round to
01058      * fRoundingIncrement.getDouble().  Since this operation may be expensive,
01059      * we cache the result in fRoundingDouble.  All methods that update
01060      * fRoundingIncrement also update fRoundingDouble. */
01061     DigitList*              fRoundingIncrement;
01062     /*transient*/ double    fRoundingDouble;
01063     ERoundingMode           fRoundingMode;
01064 
01065     UChar                   fPad;
01066     int32_t                 fFormatWidth;
01067     EPadPosition            fPadPosition;
01068 
01069     // Constants for characters used in programmatic (unlocalized) patterns.
01070     static const UChar    kPatternZeroDigit;
01071     static const UChar    kPatternGroupingSeparator;
01072     static const UChar    kPatternDecimalSeparator;
01073     static const UChar    kPatternPerMill;
01074     static const UChar    kPatternPercent;
01075     static const UChar    kPatternDigit;
01076     static const UChar    kPatternSeparator;
01077     static const UChar    kPatternExponent;
01078     static const UChar    kPatternPlus;
01079     static const UChar    kPatternMinus;
01080     static const UChar    kPatternPadEscape;
01081 
01089     static const UChar    kCurrencySign;
01090     static const UChar    kQuote;
01091 
01092 protected:
01093     static const int32_t  kDoubleIntegerDigits;
01094     static const int32_t  kDoubleFractionDigits;
01095 };
01096 
01097 inline UnicodeString&
01098 DecimalFormat::format(const Formattable& obj,
01099                       UnicodeString& result,
01100                       UErrorCode& status) const {
01101     // Don't use Format:: - use immediate base class only,
01102     // in case immediate base modifies behavior later.
01103     return NumberFormat::format(obj, result, status);
01104 }
01105 
01106 inline UnicodeString&
01107 DecimalFormat::format(double number,
01108                       UnicodeString& output) const {
01109     FieldPosition pos(0);
01110     return format(number, output, pos);
01111 }
01112 
01113 inline UnicodeString&
01114 DecimalFormat::format(int32_t number,
01115                       UnicodeString& output) const {
01116     FieldPosition pos(0);
01117     return format(number, output, pos);
01118 }
01119 
01120 inline UChar
01121 DecimalFormat::getPadCharacter() {
01122     return getPadCharacterString().charAt(0);
01123 }
01124 
01125 inline void
01126 DecimalFormat::setPadCharacter(UChar padChar) {
01127     setPadCharacter(UnicodeString(padChar));
01128 }
01129 
01130 #endif // _DECIMFMT
01131 //eof

Generated at Fri Dec 15 12:12:32 2000 for ICU 1.7 by doxygen1.2.3 written by Dimitri van Heesch, © 1997-2000