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

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 
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 
00183 class U_I18N_API DecimalFormat: public NumberFormat {
00184 public:
00188     enum ERoundingMode {
00189         kRoundCeiling,
00190         kRoundFloor,
00191         kRoundDown,
00192         kRoundUp,
00193         kRoundHalfEven,
00194         kRoundHalfDown,
00195         kRoundHalfUp
00196         // We don't support ROUND_UNNECESSARY
00197     };
00198 
00202     enum EPadPosition {
00203         kPadBeforePrefix,
00204         kPadAfterPrefix,
00205         kPadBeforeSuffix,
00206         kPadAfterSuffix
00207     };
00208 
00222     DecimalFormat(UErrorCode& status);
00223 
00238     DecimalFormat(const UnicodeString& pattern,
00239                   UErrorCode& status);
00240 
00259     DecimalFormat(  const UnicodeString& pattern,
00260                     DecimalFormatSymbols* symbolsToAdopt,
00261                     UErrorCode& status);
00262 
00282     DecimalFormat(  const UnicodeString& pattern,
00283                     DecimalFormatSymbols* symbolsToAdopt,
00284                     UParseError& parseError,
00285                     UErrorCode& status);
00303     DecimalFormat(  const UnicodeString& pattern,
00304                     const DecimalFormatSymbols& symbols,
00305                     UErrorCode& status);
00306 
00313     DecimalFormat(const DecimalFormat& source);
00314 
00321     DecimalFormat& operator=(const DecimalFormat& rhs);
00322 
00327     virtual ~DecimalFormat();
00328 
00336     virtual Format* clone(void) const;
00337 
00346     virtual UBool operator==(const Format& other) const;
00347 
00359     virtual UnicodeString& format(double number,
00360                                   UnicodeString& appendTo,
00361                                   FieldPosition& pos) const;
00373     virtual UnicodeString& format(int32_t number,
00374                                   UnicodeString& appendTo,
00375                                   FieldPosition& pos) const;
00388     virtual UnicodeString& format(const Formattable& obj,
00389                                   UnicodeString& appendTo,
00390                                   FieldPosition& pos,
00391                                   UErrorCode& status) const;
00392 
00404     UnicodeString& format(const Formattable& obj,
00405                           UnicodeString& appendTo,
00406                           UErrorCode& status) const;
00407 
00418     UnicodeString& format(double number,
00419                           UnicodeString& appendTo) const;
00420 
00432     UnicodeString& format(int32_t number,
00433                           UnicodeString& appendTo) const;
00434 
00454     virtual void parse(const UnicodeString& text,
00455                        Formattable& result,
00456                        ParsePosition& parsePosition) const;
00457 
00458     // Declare here again to get rid of function hiding problems.
00467     virtual void parse(const UnicodeString& text, 
00468                        Formattable& result, 
00469                        UErrorCode& error) const;
00470 
00478     virtual const DecimalFormatSymbols* getDecimalFormatSymbols(void) const;
00479 
00486     virtual void adoptDecimalFormatSymbols(DecimalFormatSymbols* symbolsToAdopt);
00487 
00494     virtual void setDecimalFormatSymbols(const DecimalFormatSymbols& symbols);
00495 
00496 
00505     UnicodeString& getPositivePrefix(UnicodeString& result) const;
00506 
00514     virtual void setPositivePrefix(const UnicodeString& newValue);
00515 
00524     UnicodeString& getNegativePrefix(UnicodeString& result) const;
00525 
00533     virtual void setNegativePrefix(const UnicodeString& newValue);
00534 
00543     UnicodeString& getPositiveSuffix(UnicodeString& result) const;
00544 
00552     virtual void setPositiveSuffix(const UnicodeString& newValue);
00553 
00562     UnicodeString& getNegativeSuffix(UnicodeString& result) const;
00563 
00571     virtual void setNegativeSuffix(const UnicodeString& newValue);
00572 
00583     int32_t getMultiplier(void) const;
00584 
00595     virtual void setMultiplier(int32_t newValue);
00596 
00606     virtual double getRoundingIncrement(void);
00607 
00618     virtual void setRoundingIncrement(double newValue);
00619 
00628     virtual ERoundingMode getRoundingMode(void);
00629 
00639     virtual void setRoundingMode(ERoundingMode roundingMode);
00640 
00651     virtual int32_t getFormatWidth(void);
00652 
00666     virtual void setFormatWidth(int32_t width);
00667 
00681     virtual UnicodeString getPadCharacterString();
00682 
00697     virtual void setPadCharacter(UnicodeString padChar);
00698 
00717     virtual EPadPosition getPadPosition(void);
00718 
00739     virtual void setPadPosition(EPadPosition padPos);
00740 
00751     virtual UBool isScientificNotation(void);
00752 
00764     virtual void setScientificNotation(UBool useScientific);
00765 
00776     virtual int8_t getMinimumExponentDigits(void);
00777 
00790     virtual void setMinimumExponentDigits(int8_t minExpDig);
00791 
00804     virtual UBool isExponentSignAlwaysShown(void);
00805 
00819     virtual void setExponentSignAlwaysShown(UBool expSignAlways);
00820 
00832     int32_t getGroupingSize(void) const;
00833 
00845     virtual void setGroupingSize(int32_t newValue);
00846 
00865     int32_t getSecondaryGroupingSize(void) const;
00866 
00878     virtual void setSecondaryGroupingSize(int32_t newValue);
00879 
00888     UBool isDecimalSeparatorAlwaysShown(void) const;
00889 
00898     virtual void setDecimalSeparatorAlwaysShown(UBool newValue);
00899 
00910     virtual UnicodeString& toPattern(UnicodeString& result) const;
00911 
00922     virtual UnicodeString& toLocalizedPattern(UnicodeString& result) const;
00923  
00953     virtual void applyPattern(const UnicodeString& pattern,
00954                              UParseError& parseError,
00955                              UErrorCode& status);
00964     virtual void applyPattern(const UnicodeString& pattern,
00965                              UErrorCode& status);
00966 
00997     virtual void applyLocalizedPattern(const UnicodeString& pattern,
00998                                        UParseError& parseError,
00999                                        UErrorCode& status);
01000 
01001     /*
01002      * Apply the given pattern to this Format object.
01003      *
01004      * @param pattern   The localized pattern to be applied.
01005      * @param status    Output param set to success/failure code on
01006      *                  exit. If the pattern is invalid, this will be
01007      *                  set to a failure result.
01008      * @stable ICU 2.0
01009      */
01010     virtual void applyLocalizedPattern(const UnicodeString& pattern,
01011                                        UErrorCode& status);
01012 
01013 
01023     virtual void setMaximumIntegerDigits(int32_t newValue);
01024 
01034     virtual void setMinimumIntegerDigits(int32_t newValue);
01035 
01045     virtual void setMaximumFractionDigits(int32_t newValue);
01046 
01056     virtual void setMinimumFractionDigits(int32_t newValue);
01057 
01068     void setCurrency(const UChar* theCurrency);
01069 
01082     const UChar* getCurrency() const;
01083 
01089     static const char fgNumberPatterns[];
01090 
01091 public:
01092 
01104     static UClassID getStaticClassID(void) { return (UClassID)&fgClassID; }
01105 
01117     virtual UClassID getDynamicClassID(void) const { return getStaticClassID(); }
01118 
01119 private:
01120     static const char fgClassID;
01124     void construct(UErrorCode&               status,
01125                    UParseError&             parseErr,
01126                    const UnicodeString*     pattern = 0,
01127                    DecimalFormatSymbols*    symbolsToAdopt = 0
01128                    );
01129 
01138     UnicodeString& toPattern(UnicodeString& result, UBool localized) const;
01139 
01150     void applyPattern(const UnicodeString& pattern,
01151                             UBool localized,
01152                             UParseError& parseError,
01153                             UErrorCode& status);
01165     UnicodeString& subformat(UnicodeString& appendTo,
01166                              FieldPosition& fieldPosition,
01167                              DigitList& digits,
01168                              UBool         isInteger) const;
01169 
01170     enum {
01171         fgStatusInfinite,
01172         fgStatusLength      // Leave last in list.
01173     } StatusFlags;
01174 
01187     UBool subparse(const UnicodeString& text, ParsePosition& parsePosition,
01188                     DigitList& digits, UBool* status) const;
01189 
01195     inline const UnicodeString &getConstSymbol(DecimalFormatSymbols::ENumberFormatSymbol symbol) const;
01196 
01202     void appendAffix(UnicodeString& appendTo, const UnicodeString& affix, 
01203                      UBool localized) const;
01204 
01205     void appendAffix(UnicodeString& appendTo,
01206                      const UnicodeString* affixPattern,
01207                      const UnicodeString& expAffix, UBool localized) const;
01208 
01209     void expandAffix(const UnicodeString& pattern,
01210                      UnicodeString& affix) const;
01211 
01212     void expandAffixes(void);
01213     
01214     static double round(double a, ERoundingMode mode, UBool isNegative);
01215 
01216     void addPadding(UnicodeString& appendTo,
01217                     FieldPosition& fieldPosition,
01218                     UBool hasAffixes,
01219                     UBool isNegative) const;
01220 
01221     UBool isGroupingPosition(int32_t pos) const;
01222 
01223     void setCurrencyForSymbols();
01224 
01225     void setCurrencyForLocale(const char* locale, UErrorCode& ec);
01226 
01230     //static const int8_t fgMaxDigit; // The largest digit, in this case 9
01231 
01232     /*transient*/ //DigitList* fDigitList;
01233 
01234     UnicodeString           fPositivePrefix;
01235     UnicodeString           fPositiveSuffix;
01236     UnicodeString           fNegativePrefix;
01237     UnicodeString           fNegativeSuffix;
01238     UnicodeString*          fPosPrefixPattern;
01239     UnicodeString*          fPosSuffixPattern;
01240     UnicodeString*          fNegPrefixPattern;
01241     UnicodeString*          fNegSuffixPattern;
01242     int32_t                 fMultiplier;
01243     int32_t                 fGroupingSize;
01244     int32_t                 fGroupingSize2;
01245     UBool                  fDecimalSeparatorAlwaysShown;
01246     /*transient*/ UBool    fIsCurrencyFormat;
01247     DecimalFormatSymbols*   fSymbols;
01248 
01249     UBool                  fUseExponentialNotation;
01250     int8_t                  fMinExponentDigits;
01251     UBool                  fExponentSignAlwaysShown;
01252 
01253     /* If fRoundingIncrement is NULL, there is no rounding.  Otherwise, round to
01254      * fRoundingIncrement.getDouble().  Since this operation may be expensive,
01255      * we cache the result in fRoundingDouble.  All methods that update
01256      * fRoundingIncrement also update fRoundingDouble. */
01257     DigitList*              fRoundingIncrement;
01258     /*transient*/ double    fRoundingDouble;
01259     ERoundingMode           fRoundingMode;
01260 
01261     UnicodeString           fPad;
01262     int32_t                 fFormatWidth;
01263     EPadPosition            fPadPosition;
01264 
01265     // ISO currency code
01266     UChar                   currency[4];
01267 
01268     // Constants for characters used in programmatic (unlocalized) patterns.
01269     static const UChar    kPatternZeroDigit;
01270     static const UChar    kPatternGroupingSeparator;
01271     static const UChar    kPatternDecimalSeparator;
01272     static const UChar    kPatternPerMill;
01273     static const UChar    kPatternPercent;
01274     static const UChar    kPatternDigit;
01275     static const UChar    kPatternSeparator;
01276     static const UChar    kPatternExponent;
01277     static const UChar    kPatternPlus;
01278     static const UChar    kPatternMinus;
01279     static const UChar    kPatternPadEscape;
01280 
01288     static const UChar    kCurrencySign;
01289     static const UChar    kQuote;
01290 
01291 protected:
01295     static const int32_t  kDoubleIntegerDigits;
01299     static const int32_t  kDoubleFractionDigits;
01300 };
01301 
01302 inline UnicodeString&
01303 DecimalFormat::format(const Formattable& obj,
01304                       UnicodeString& appendTo,
01305                       UErrorCode& status) const {
01306     // Don't use Format:: - use immediate base class only,
01307     // in case immediate base modifies behavior later.
01308     return NumberFormat::format(obj, appendTo, status);
01309 }
01310 
01311 inline UnicodeString&
01312 DecimalFormat::format(double number,
01313                       UnicodeString& appendTo) const {
01314     FieldPosition pos(0);
01315     return format(number, appendTo, pos);
01316 }
01317 
01318 inline UnicodeString&
01319 DecimalFormat::format(int32_t number,
01320                       UnicodeString& appendTo) const {
01321     FieldPosition pos(0);
01322     return format(number, appendTo, pos);
01323 }
01324 
01325 inline const UnicodeString &
01326 DecimalFormat::getConstSymbol(DecimalFormatSymbols::ENumberFormatSymbol symbol) const {
01327     return fSymbols->getConstSymbol(symbol);
01328 }
01329 
01330 U_NAMESPACE_END
01331 
01332 #endif /* #if !UCONFIG_NO_FORMATTING */
01333 
01334 #endif // _DECIMFMT
01335 //eof

Generated on Wed Dec 18 16:49:33 2002 for ICU 2.4 by doxygen1.2.11.1 written by Dimitri van Heesch, © 1997-2001