Main Page | Class Hierarchy | Alphabetical List | Data Structures | Directories | File List | Data Fields | Globals | Related Pages

decimfmt.h

00001 /*
00002 ********************************************************************************
00003 *   Copyright (C) 1997-2003, 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 class ChoiceFormat;
00039 
00184 class U_I18N_API DecimalFormat: public NumberFormat {
00185 public:
00189     enum ERoundingMode {
00190         kRoundCeiling,
00191         kRoundFloor,
00192         kRoundDown,
00193         kRoundUp,
00194         kRoundHalfEven,
00195         kRoundHalfDown,
00196         kRoundHalfUp
00197         // We don't support ROUND_UNNECESSARY
00198     };
00199 
00203     enum EPadPosition {
00204         kPadBeforePrefix,
00205         kPadAfterPrefix,
00206         kPadBeforeSuffix,
00207         kPadAfterSuffix
00208     };
00209 
00223     DecimalFormat(UErrorCode& status);
00224 
00239     DecimalFormat(const UnicodeString& pattern,
00240                   UErrorCode& status);
00241 
00260     DecimalFormat(  const UnicodeString& pattern,
00261                     DecimalFormatSymbols* symbolsToAdopt,
00262                     UErrorCode& status);
00263 
00283     DecimalFormat(  const UnicodeString& pattern,
00284                     DecimalFormatSymbols* symbolsToAdopt,
00285                     UParseError& parseError,
00286                     UErrorCode& status);
00304     DecimalFormat(  const UnicodeString& pattern,
00305                     const DecimalFormatSymbols& symbols,
00306                     UErrorCode& status);
00307 
00314     DecimalFormat(const DecimalFormat& source);
00315 
00322     DecimalFormat& operator=(const DecimalFormat& rhs);
00323 
00328     virtual ~DecimalFormat();
00329 
00337     virtual Format* clone(void) const;
00338 
00347     virtual UBool operator==(const Format& other) const;
00348 
00360     virtual UnicodeString& format(double number,
00361                                   UnicodeString& appendTo,
00362                                   FieldPosition& pos) const;
00374     virtual UnicodeString& format(int32_t number,
00375                                   UnicodeString& appendTo,
00376                                   FieldPosition& pos) const;
00388     virtual UnicodeString& format(int64_t number,
00389                                   UnicodeString& appendTo,
00390                                   FieldPosition& pos) const;
00391 
00404     virtual UnicodeString& format(const Formattable& obj,
00405                                   UnicodeString& appendTo,
00406                                   FieldPosition& pos,
00407                                   UErrorCode& status) const;
00408 
00420     UnicodeString& format(const Formattable& obj,
00421                           UnicodeString& appendTo,
00422                           UErrorCode& status) const;
00423 
00434     UnicodeString& format(double number,
00435                           UnicodeString& appendTo) const;
00436 
00448     UnicodeString& format(int32_t number,
00449                           UnicodeString& appendTo) const;
00450 
00462     UnicodeString& format(int64_t number,
00463                           UnicodeString& appendTo) const;
00483     virtual void parse(const UnicodeString& text,
00484                        Formattable& result,
00485                        ParsePosition& parsePosition) const;
00486 
00487     // Declare here again to get rid of function hiding problems.
00496     virtual void parse(const UnicodeString& text, 
00497                        Formattable& result, 
00498                        UErrorCode& status) const;
00499 
00507     virtual const DecimalFormatSymbols* getDecimalFormatSymbols(void) const;
00508 
00515     virtual void adoptDecimalFormatSymbols(DecimalFormatSymbols* symbolsToAdopt);
00516 
00523     virtual void setDecimalFormatSymbols(const DecimalFormatSymbols& symbols);
00524 
00525 
00534     UnicodeString& getPositivePrefix(UnicodeString& result) const;
00535 
00543     virtual void setPositivePrefix(const UnicodeString& newValue);
00544 
00553     UnicodeString& getNegativePrefix(UnicodeString& result) const;
00554 
00562     virtual void setNegativePrefix(const UnicodeString& newValue);
00563 
00572     UnicodeString& getPositiveSuffix(UnicodeString& result) const;
00573 
00581     virtual void setPositiveSuffix(const UnicodeString& newValue);
00582 
00591     UnicodeString& getNegativeSuffix(UnicodeString& result) const;
00592 
00600     virtual void setNegativeSuffix(const UnicodeString& newValue);
00601 
00612     int32_t getMultiplier(void) const;
00613 
00624     virtual void setMultiplier(int32_t newValue);
00625 
00635     virtual double getRoundingIncrement(void);
00636 
00647     virtual void setRoundingIncrement(double newValue);
00648 
00657     virtual ERoundingMode getRoundingMode(void);
00658 
00668     virtual void setRoundingMode(ERoundingMode roundingMode);
00669 
00680     virtual int32_t getFormatWidth(void);
00681 
00695     virtual void setFormatWidth(int32_t width);
00696 
00710     virtual UnicodeString getPadCharacterString();
00711 
00726     virtual void setPadCharacter(const UnicodeString &padChar);
00727 
00746     virtual EPadPosition getPadPosition(void);
00747 
00768     virtual void setPadPosition(EPadPosition padPos);
00769 
00780     virtual UBool isScientificNotation(void);
00781 
00797     virtual void setScientificNotation(UBool useScientific);
00798 
00809     virtual int8_t getMinimumExponentDigits(void);
00810 
00823     virtual void setMinimumExponentDigits(int8_t minExpDig);
00824 
00837     virtual UBool isExponentSignAlwaysShown(void);
00838 
00852     virtual void setExponentSignAlwaysShown(UBool expSignAlways);
00853 
00865     int32_t getGroupingSize(void) const;
00866 
00878     virtual void setGroupingSize(int32_t newValue);
00879 
00898     int32_t getSecondaryGroupingSize(void) const;
00899 
00911     virtual void setSecondaryGroupingSize(int32_t newValue);
00912 
00921     UBool isDecimalSeparatorAlwaysShown(void) const;
00922 
00931     virtual void setDecimalSeparatorAlwaysShown(UBool newValue);
00932 
00943     virtual UnicodeString& toPattern(UnicodeString& result) const;
00944 
00955     virtual UnicodeString& toLocalizedPattern(UnicodeString& result) const;
00956  
00986     virtual void applyPattern(const UnicodeString& pattern,
00987                              UParseError& parseError,
00988                              UErrorCode& status);
00997     virtual void applyPattern(const UnicodeString& pattern,
00998                              UErrorCode& status);
00999 
01030     virtual void applyLocalizedPattern(const UnicodeString& pattern,
01031                                        UParseError& parseError,
01032                                        UErrorCode& status);
01033 
01043     virtual void applyLocalizedPattern(const UnicodeString& pattern,
01044                                        UErrorCode& status);
01045 
01046 
01056     virtual void setMaximumIntegerDigits(int32_t newValue);
01057 
01067     virtual void setMinimumIntegerDigits(int32_t newValue);
01068 
01078     virtual void setMaximumFractionDigits(int32_t newValue);
01079 
01089     virtual void setMinimumFractionDigits(int32_t newValue);
01090 
01101     virtual void setCurrency(const UChar* theCurrency);
01102 
01108     static const char fgNumberPatterns[];
01109 
01110 public:
01111 
01123     static UClassID getStaticClassID(void);
01124 
01136     virtual UClassID getDynamicClassID(void) const;
01137 
01138 private:
01139     DecimalFormat(); // default constructor not implemented
01140 
01141         int32_t precision(UBool isIntegral) const;
01142 
01146     void construct(UErrorCode&               status,
01147                    UParseError&             parseErr,
01148                    const UnicodeString*     pattern = 0,
01149                    DecimalFormatSymbols*    symbolsToAdopt = 0
01150                    );
01151 
01160     UnicodeString& toPattern(UnicodeString& result, UBool localized) const;
01161 
01172     void applyPattern(const UnicodeString& pattern,
01173                             UBool localized,
01174                             UParseError& parseError,
01175                             UErrorCode& status);
01187     UnicodeString& subformat(UnicodeString& appendTo,
01188                              FieldPosition& fieldPosition,
01189                              DigitList& digits,
01190                              UBool         isInteger) const;
01191 
01192     enum {
01193         fgStatusInfinite,
01194         fgStatusLength      // Leave last in list.
01195     } StatusFlags;
01196 
01209     UBool subparse(const UnicodeString& text, ParsePosition& parsePosition,
01210                     DigitList& digits, UBool* status) const;
01211 
01212     int32_t skipPadding(const UnicodeString& text, int32_t position) const;
01213 
01214     int32_t compareAffix(const UnicodeString& input,
01215                          int32_t pos,
01216                          UBool isNegative,
01217                          UBool isPrefix) const;
01218     
01219     static int32_t compareSimpleAffix(const UnicodeString& affix,
01220                                       const UnicodeString& input,
01221                                       int32_t pos);
01222     
01223     static int32_t skipRuleWhiteSpace(const UnicodeString& text, int32_t pos);
01224     
01225     static int32_t skipUWhiteSpace(const UnicodeString& text, int32_t pos);
01226     
01227     int32_t compareComplexAffix(const UnicodeString& affixPat,
01228                                 const UnicodeString& input,
01229                                 int32_t pos) const;
01230 
01231     static int32_t match(const UnicodeString& text, int32_t pos, UChar32 ch);
01232 
01233     static int32_t match(const UnicodeString& text, int32_t pos, const UnicodeString& str);
01234 
01240     inline const UnicodeString &getConstSymbol(DecimalFormatSymbols::ENumberFormatSymbol symbol) const;
01241 
01242     int32_t appendAffix(UnicodeString& buf, double number,
01243                         UBool isNegative, UBool isPrefix) const;
01244 
01250     void appendAffixPattern(UnicodeString& appendTo, const UnicodeString& affix, 
01251                             UBool localized) const;
01252 
01253     void appendAffixPattern(UnicodeString& appendTo,
01254                             const UnicodeString* affixPattern,
01255                             const UnicodeString& expAffix, UBool localized) const;
01256 
01257     void expandAffix(const UnicodeString& pattern,
01258                      UnicodeString& affix,
01259                      double number,
01260                      UBool doFormat) const;
01261 
01262     void expandAffixes();
01263     
01264     static double round(double a, ERoundingMode mode, UBool isNegative);
01265 
01266     void addPadding(UnicodeString& appendTo,
01267                     FieldPosition& fieldPosition,
01268                     int32_t prefixLen, int32_t suffixLen) const;
01269 
01270     UBool isGroupingPosition(int32_t pos) const;
01271 
01272     void setCurrencyForSymbols();
01273 
01274     void setCurrencyForLocale(const char* locale, UErrorCode& ec);
01275 
01279     //static const int8_t fgMaxDigit; // The largest digit, in this case 9
01280 
01281     /*transient*/ //DigitList* fDigitList;
01282 
01283     UnicodeString           fPositivePrefix;
01284     UnicodeString           fPositiveSuffix;
01285     UnicodeString           fNegativePrefix;
01286     UnicodeString           fNegativeSuffix;
01287     UnicodeString*          fPosPrefixPattern;
01288     UnicodeString*          fPosSuffixPattern;
01289     UnicodeString*          fNegPrefixPattern;
01290     UnicodeString*          fNegSuffixPattern;
01291 
01297     ChoiceFormat*           fCurrencyChoice;
01298 
01299     int32_t                 fMultiplier;
01300     int32_t                 fGroupingSize;
01301     int32_t                 fGroupingSize2;
01302     UBool                  fDecimalSeparatorAlwaysShown;
01303     /*transient*/ UBool    fIsCurrencyFormat;
01304     DecimalFormatSymbols*   fSymbols;
01305 
01306     UBool                  fUseExponentialNotation;
01307     int8_t                  fMinExponentDigits;
01308     UBool                  fExponentSignAlwaysShown;
01309 
01310     /* If fRoundingIncrement is NULL, there is no rounding.  Otherwise, round to
01311      * fRoundingIncrement.getDouble().  Since this operation may be expensive,
01312      * we cache the result in fRoundingDouble.  All methods that update
01313      * fRoundingIncrement also update fRoundingDouble. */
01314     DigitList*              fRoundingIncrement;
01315     /*transient*/ double    fRoundingDouble;
01316     ERoundingMode           fRoundingMode;
01317 
01318     UChar32                 fPad;
01319     int32_t                 fFormatWidth;
01320     EPadPosition            fPadPosition;
01321 
01322 protected:
01326     static const int32_t  kDoubleIntegerDigits;
01330     static const int32_t  kDoubleFractionDigits;
01331 
01341         static const int32_t  kMaxScientificIntegerDigits;
01342 };
01343 
01344 inline UnicodeString&
01345 DecimalFormat::format(const Formattable& obj,
01346                       UnicodeString& appendTo,
01347                       UErrorCode& status) const {
01348     // Don't use Format:: - use immediate base class only,
01349     // in case immediate base modifies behavior later.
01350     return NumberFormat::format(obj, appendTo, status);
01351 }
01352 
01353 inline UnicodeString&
01354 DecimalFormat::format(double number,
01355                       UnicodeString& appendTo) const {
01356     FieldPosition pos(0);
01357     return format(number, appendTo, pos);
01358 }
01359 
01360 inline UnicodeString&
01361 DecimalFormat::format(int32_t number,
01362                       UnicodeString& appendTo) const {
01363     FieldPosition pos(0);
01364     return format((int64_t)number, appendTo, pos);
01365 }
01366 
01367 inline const UnicodeString &
01368 DecimalFormat::getConstSymbol(DecimalFormatSymbols::ENumberFormatSymbol symbol) const {
01369     return fSymbols->getConstSymbol(symbol);
01370 }
01371 
01372 U_NAMESPACE_END
01373 
01374 #endif /* #if !UCONFIG_NO_FORMATTING */
01375 
01376 #endif // _DECIMFMT
01377 //eof

Generated on Wed May 18 17:29:14 2005 for ICU 2.8 by  doxygen 1.4.2