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-2001, 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,
01027                     FieldPosition& fieldPosition,
01028                     UBool hasAffixes,
01029                     UBool isNegative) const;
01030 
01031     UBool isGroupingPosition(int32_t pos) const;
01032 
01036     //static const int8_t fgMaxDigit; // The largest digit, in this case 9
01037 
01038     /*transient*/ //DigitList* fDigitList;
01039 
01040     UnicodeString           fPositivePrefix;
01041     UnicodeString           fPositiveSuffix;
01042     UnicodeString           fNegativePrefix;
01043     UnicodeString           fNegativeSuffix;
01044     UnicodeString*          fPosPrefixPattern;
01045     UnicodeString*          fPosSuffixPattern;
01046     UnicodeString*          fNegPrefixPattern;
01047     UnicodeString*          fNegSuffixPattern;
01048     int32_t                 fMultiplier;
01049     int32_t                 fGroupingSize;
01050     int32_t                 fGroupingSize2;
01051     UBool                  fDecimalSeparatorAlwaysShown;
01052     /*transient*/ UBool    fIsCurrencyFormat;
01053     /* @deprecated */ DecimalFormatSymbols*   fSymbols;
01054 
01055     UBool                  fUseExponentialNotation;
01056     int8_t                  fMinExponentDigits;
01057     UBool                  fExponentSignAlwaysShown;
01058 
01059     /* If fRoundingIncrement is NULL, there is no rounding.  Otherwise, round to
01060      * fRoundingIncrement.getDouble().  Since this operation may be expensive,
01061      * we cache the result in fRoundingDouble.  All methods that update
01062      * fRoundingIncrement also update fRoundingDouble. */
01063     DigitList*              fRoundingIncrement;
01064     /*transient*/ double    fRoundingDouble;
01065     ERoundingMode           fRoundingMode;
01066 
01067     UChar                   fPad;
01068     int32_t                 fFormatWidth;
01069     EPadPosition            fPadPosition;
01070 
01071     // Constants for characters used in programmatic (unlocalized) patterns.
01072     static const UChar    kPatternZeroDigit;
01073     static const UChar    kPatternGroupingSeparator;
01074     static const UChar    kPatternDecimalSeparator;
01075     static const UChar    kPatternPerMill;
01076     static const UChar    kPatternPercent;
01077     static const UChar    kPatternDigit;
01078     static const UChar    kPatternSeparator;
01079     static const UChar    kPatternExponent;
01080     static const UChar    kPatternPlus;
01081     static const UChar    kPatternMinus;
01082     static const UChar    kPatternPadEscape;
01083 
01091     static const UChar    kCurrencySign;
01092     static const UChar    kQuote;
01093 
01094 protected:
01095     static const int32_t  kDoubleIntegerDigits;
01096     static const int32_t  kDoubleFractionDigits;
01097 };
01098 
01099 inline UnicodeString&
01100 DecimalFormat::format(const Formattable& obj,
01101                       UnicodeString& result,
01102                       UErrorCode& status) const {
01103     // Don't use Format:: - use immediate base class only,
01104     // in case immediate base modifies behavior later.
01105     return NumberFormat::format(obj, result, status);
01106 }
01107 
01108 inline UnicodeString&
01109 DecimalFormat::format(double number,
01110                       UnicodeString& output) const {
01111     FieldPosition pos(0);
01112     return format(number, output, pos);
01113 }
01114 
01115 inline UnicodeString&
01116 DecimalFormat::format(int32_t number,
01117                       UnicodeString& output) const {
01118     FieldPosition pos(0);
01119     return format(number, output, pos);
01120 }
01121 
01122 inline UChar
01123 DecimalFormat::getPadCharacter() {
01124     return getPadCharacterString().charAt(0);
01125 }
01126 
01127 inline void
01128 DecimalFormat::setPadCharacter(UChar padChar) {
01129     setPadCharacter(UnicodeString(padChar));
01130 }
01131 
01132 #endif // _DECIMFMT
01133 //eof

Generated at Thu Mar 22 16:12:35 2001 for ICU 1.8 by doxygen1.2.3 written by Dimitri van Heesch, © 1997-2000