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 #include "unicode/numfmt.h"
00029 #include "unicode/locid.h"
00030 
00031 U_NAMESPACE_BEGIN
00032 
00033 class DecimalFormatSymbols;
00034 class DigitList;
00035 
00180 class U_I18N_API DecimalFormat: public NumberFormat {
00181 public:
00182     enum ERoundingMode {
00183         kRoundCeiling,
00184         kRoundFloor,
00185         kRoundDown,
00186         kRoundUp,
00187         kRoundHalfEven,
00188         kRoundHalfDown,
00189         kRoundHalfUp
00190         // We don't support ROUND_UNNECESSARY
00191     };
00192 
00193     enum EPadPosition {
00194         kPadBeforePrefix,
00195         kPadAfterPrefix,
00196         kPadBeforeSuffix,
00197         kPadAfterSuffix
00198     };
00199 
00213     DecimalFormat(UErrorCode& status);
00214 
00229     DecimalFormat(const UnicodeString& pattern,
00230                   UErrorCode& status);
00231 
00250     DecimalFormat(  const UnicodeString& pattern,
00251                     DecimalFormatSymbols* symbolsToAdopt,
00252                     UErrorCode& status);
00253 
00273     DecimalFormat(  const UnicodeString& pattern,
00274                     DecimalFormatSymbols* symbolsToAdopt,
00275                     UParseError& parseError,
00276                     UErrorCode& status);
00294     DecimalFormat(  const UnicodeString& pattern,
00295                     const DecimalFormatSymbols& symbols,
00296                     UErrorCode& status);
00297 
00304     DecimalFormat(const DecimalFormat& source);
00305 
00312     DecimalFormat& operator=(const DecimalFormat& rhs);
00313 
00318     virtual ~DecimalFormat();
00319 
00327     virtual Format* clone(void) const;
00328 
00337     virtual UBool operator==(const Format& other) const;
00338 
00350     virtual UnicodeString& format(double number,
00351                                   UnicodeString& toAppendTo,
00352                                   FieldPosition& pos) const;
00364     virtual UnicodeString& format(int32_t number,
00365                                   UnicodeString& toAppendTo,
00366                                   FieldPosition& pos) const;
00379     virtual UnicodeString& format(const Formattable& obj,
00380                                   UnicodeString& toAppendTo,
00381                                   FieldPosition& pos,
00382                                   UErrorCode& status) const;
00383 
00395     UnicodeString& format(const Formattable& obj,
00396                           UnicodeString& result,
00397                           UErrorCode& status) const;
00398 
00408     UnicodeString& format(double number,
00409                           UnicodeString& output) const;
00410 
00421     UnicodeString& format(int32_t number,
00422                           UnicodeString& output) const;
00423 
00443     virtual void parse(const UnicodeString& text,
00444                        Formattable& result,
00445                        ParsePosition& parsePosition) const;
00446 
00447     // Declare here again to get rid of function hiding problems.
00456     virtual void parse(const UnicodeString& text, 
00457                        Formattable& result, 
00458                        UErrorCode& error) const;
00459 
00467     virtual const DecimalFormatSymbols* getDecimalFormatSymbols(void) const;
00468 
00475     virtual void adoptDecimalFormatSymbols(DecimalFormatSymbols* symbolsToAdopt);
00476 
00483     virtual void setDecimalFormatSymbols(const DecimalFormatSymbols& symbols);
00484 
00485 
00494     UnicodeString& getPositivePrefix(UnicodeString& result) const;
00495 
00503     virtual void setPositivePrefix(const UnicodeString& newValue);
00504 
00513     UnicodeString& getNegativePrefix(UnicodeString& result) const;
00514 
00522     virtual void setNegativePrefix(const UnicodeString& newValue);
00523 
00532     UnicodeString& getPositiveSuffix(UnicodeString& result) const;
00533 
00541     virtual void setPositiveSuffix(const UnicodeString& newValue);
00542 
00551     UnicodeString& getNegativeSuffix(UnicodeString& result) const;
00552 
00560     virtual void setNegativeSuffix(const UnicodeString& newValue);
00561 
00572     int32_t getMultiplier(void) const;
00573 
00584     virtual void setMultiplier(int32_t newValue);
00585 
00595     virtual double getRoundingIncrement(void);
00596 
00607     virtual void setRoundingIncrement(double newValue);
00608 
00617     virtual ERoundingMode getRoundingMode(void);
00618 
00628     virtual void setRoundingMode(ERoundingMode roundingMode);
00629 
00640     virtual int32_t getFormatWidth(void);
00641 
00655     virtual void setFormatWidth(int32_t width);
00656 
00670     virtual UnicodeString getPadCharacterString();
00671 
00686     virtual void setPadCharacter(UnicodeString padChar);
00687 
00706     virtual EPadPosition getPadPosition(void);
00707 
00728     virtual void setPadPosition(EPadPosition padPos);
00729 
00740     virtual UBool isScientificNotation(void);
00741 
00753     virtual void setScientificNotation(UBool useScientific);
00754 
00765     virtual int8_t getMinimumExponentDigits(void);
00766 
00779     virtual void setMinimumExponentDigits(int8_t minExpDig);
00780 
00793     virtual UBool isExponentSignAlwaysShown(void);
00794 
00808     virtual void setExponentSignAlwaysShown(UBool expSignAlways);
00809 
00821     int32_t getGroupingSize(void) const;
00822 
00834     virtual void setGroupingSize(int32_t newValue);
00835 
00853     int32_t getSecondaryGroupingSize(void) const;
00854 
00865     virtual void setSecondaryGroupingSize(int32_t newValue);
00866 
00875     UBool isDecimalSeparatorAlwaysShown(void) const;
00876 
00885     virtual void setDecimalSeparatorAlwaysShown(UBool newValue);
00886 
00896     virtual UnicodeString& toPattern(UnicodeString& result) const;
00897 
00907     virtual UnicodeString& toLocalizedPattern(UnicodeString& result) const;
00908  
00938     virtual void applyPattern(const UnicodeString& pattern,
00939                              UParseError& parseError,
00940                              UErrorCode& status);
00949     virtual void applyPattern(const UnicodeString& pattern,
00950                              UErrorCode& status);
00951 
00982     virtual void applyLocalizedPattern(const UnicodeString& pattern,
00983                                        UParseError& parseError,
00984                                        UErrorCode& status);
00985 
00986     /*
00987      * Apply the given pattern to this Format object.
00988      *
00989      * @param pattern   The localized pattern to be applied.
00990      * @param status    Output param set to success/failure code on
00991      *                  exit. If the pattern is invalid, this will be
00992      *                  set to a failure result.
00993      * @stable
00994      */
00995     virtual void applyLocalizedPattern(const UnicodeString& pattern,
00996                                        UErrorCode& status);
00997 
00998 
01008     virtual void setMaximumIntegerDigits(int32_t newValue);
01009 
01019     virtual void setMinimumIntegerDigits(int32_t newValue);
01020 
01030     virtual void setMaximumFractionDigits(int32_t newValue);
01031 
01041     virtual void setMinimumFractionDigits(int32_t newValue);
01042 
01053     void setCurrency(const UChar* theCurrency);
01054 
01067     const UChar* getCurrency() const;
01068 
01074     static const char fgNumberPatterns[];
01075 
01076 public:
01077 
01089     static UClassID getStaticClassID(void) { return (UClassID)&fgClassID; }
01090 
01102     virtual UClassID getDynamicClassID(void) const { return getStaticClassID(); }
01103 
01104 private:
01105     static const char fgClassID;
01109     void construct(UErrorCode&               status,
01110                    UParseError&             parseErr,
01111                    const UnicodeString*     pattern = 0,
01112                    DecimalFormatSymbols*    symbolsToAdopt = 0
01113                    );
01114 
01122     UnicodeString& toPattern(UnicodeString& result, UBool localized) const;
01123 
01134     void applyPattern(const UnicodeString& pattern,
01135                             UBool localized,
01136                             UParseError& parseError,
01137                             UErrorCode& status);
01148     UnicodeString& subformat(UnicodeString& result,
01149                              FieldPosition& fieldPosition,
01150                              DigitList& digits,
01151                              UBool         isInteger) const;
01152 
01153     enum {
01154         fgStatusInfinite,
01155         fgStatusLength      // Leave last in list.
01156     } StatusFlags;
01157 
01170     UBool subparse(const UnicodeString& text, ParsePosition& parsePosition,
01171                     DigitList& digits, UBool* status) const;
01172 
01178     void appendAffix(UnicodeString& buffer, const UnicodeString& affix, 
01179                      UBool localized) const;
01180 
01181     void appendAffix(UnicodeString& buffer,
01182                      const UnicodeString* affixPattern,
01183                      const UnicodeString& expAffix, UBool localized) const;
01184 
01185     void expandAffix(const UnicodeString& pattern,
01186                      UnicodeString& affix) const;
01187 
01188     void expandAffixes(void);
01189     
01190     static double round(double a, ERoundingMode mode, UBool isNegative);
01191 
01192     void addPadding(UnicodeString& result,
01193                     FieldPosition& fieldPosition,
01194                     UBool hasAffixes,
01195                     UBool isNegative) const;
01196 
01197     UBool isGroupingPosition(int32_t pos) const;
01198 
01199     void setCurrencyForSymbols();
01200 
01201     void setCurrencyForLocale(const char* locale, UErrorCode& ec);
01202 
01206     //static const int8_t fgMaxDigit; // The largest digit, in this case 9
01207 
01208     /*transient*/ //DigitList* fDigitList;
01209 
01210     UnicodeString           fPositivePrefix;
01211     UnicodeString           fPositiveSuffix;
01212     UnicodeString           fNegativePrefix;
01213     UnicodeString           fNegativeSuffix;
01214     UnicodeString*          fPosPrefixPattern;
01215     UnicodeString*          fPosSuffixPattern;
01216     UnicodeString*          fNegPrefixPattern;
01217     UnicodeString*          fNegSuffixPattern;
01218     int32_t                 fMultiplier;
01219     int32_t                 fGroupingSize;
01220     int32_t                 fGroupingSize2;
01221     UBool                  fDecimalSeparatorAlwaysShown;
01222     /*transient*/ UBool    fIsCurrencyFormat;
01223     /* @deprecated */ DecimalFormatSymbols*   fSymbols;
01224 
01225     UBool                  fUseExponentialNotation;
01226     int8_t                  fMinExponentDigits;
01227     UBool                  fExponentSignAlwaysShown;
01228 
01229     /* If fRoundingIncrement is NULL, there is no rounding.  Otherwise, round to
01230      * fRoundingIncrement.getDouble().  Since this operation may be expensive,
01231      * we cache the result in fRoundingDouble.  All methods that update
01232      * fRoundingIncrement also update fRoundingDouble. */
01233     DigitList*              fRoundingIncrement;
01234     /*transient*/ double    fRoundingDouble;
01235     ERoundingMode           fRoundingMode;
01236 
01237     UnicodeString           fPad;
01238     int32_t                 fFormatWidth;
01239     EPadPosition            fPadPosition;
01240 
01241     // ISO currency code
01242     UChar                   currency[4];
01243 
01244     // Constants for characters used in programmatic (unlocalized) patterns.
01245     static const UChar    kPatternZeroDigit;
01246     static const UChar    kPatternGroupingSeparator;
01247     static const UChar    kPatternDecimalSeparator;
01248     static const UChar    kPatternPerMill;
01249     static const UChar    kPatternPercent;
01250     static const UChar    kPatternDigit;
01251     static const UChar    kPatternSeparator;
01252     static const UChar    kPatternExponent;
01253     static const UChar    kPatternPlus;
01254     static const UChar    kPatternMinus;
01255     static const UChar    kPatternPadEscape;
01256 
01264     static const UChar    kCurrencySign;
01265     static const UChar    kQuote;
01266 
01267 protected:
01268     static const int32_t  kDoubleIntegerDigits;
01269     static const int32_t  kDoubleFractionDigits;
01270 };
01271 
01272 inline UnicodeString&
01273 DecimalFormat::format(const Formattable& obj,
01274                       UnicodeString& result,
01275                       UErrorCode& status) const {
01276     // Don't use Format:: - use immediate base class only,
01277     // in case immediate base modifies behavior later.
01278     return NumberFormat::format(obj, result, status);
01279 }
01280 
01281 inline UnicodeString&
01282 DecimalFormat::format(double number,
01283                       UnicodeString& output) const {
01284     FieldPosition pos(0);
01285     return format(number, output, pos);
01286 }
01287 
01288 inline UnicodeString&
01289 DecimalFormat::format(int32_t number,
01290                       UnicodeString& output) const {
01291     FieldPosition pos(0);
01292     return format(number, output, pos);
01293 }
01294 
01295 
01296 U_NAMESPACE_END
01297 
01298 #endif // _DECIMFMT
01299 //eof

Generated on Thu Aug 15 14:13:24 2002 for ICU 2.2 by doxygen1.2.11.1 written by Dimitri van Heesch, © 1997-2001