Main Page | Class Hierarchy | Alphabetical List | Data Structures | 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;
00389     virtual UnicodeString& format(const Formattable& obj,
00390                                   UnicodeString& appendTo,
00391                                   FieldPosition& pos,
00392                                   UErrorCode& status) const;
00393 
00405     UnicodeString& format(const Formattable& obj,
00406                           UnicodeString& appendTo,
00407                           UErrorCode& status) const;
00408 
00419     UnicodeString& format(double number,
00420                           UnicodeString& appendTo) const;
00421 
00433     UnicodeString& format(int32_t number,
00434                           UnicodeString& appendTo) const;
00435 
00455     virtual void parse(const UnicodeString& text,
00456                        Formattable& result,
00457                        ParsePosition& parsePosition) const;
00458 
00459     // Declare here again to get rid of function hiding problems.
00468     virtual void parse(const UnicodeString& text, 
00469                        Formattable& result, 
00470                        UErrorCode& status) const;
00471 
00479     virtual const DecimalFormatSymbols* getDecimalFormatSymbols(void) const;
00480 
00487     virtual void adoptDecimalFormatSymbols(DecimalFormatSymbols* symbolsToAdopt);
00488 
00495     virtual void setDecimalFormatSymbols(const DecimalFormatSymbols& symbols);
00496 
00497 
00506     UnicodeString& getPositivePrefix(UnicodeString& result) const;
00507 
00515     virtual void setPositivePrefix(const UnicodeString& newValue);
00516 
00525     UnicodeString& getNegativePrefix(UnicodeString& result) const;
00526 
00534     virtual void setNegativePrefix(const UnicodeString& newValue);
00535 
00544     UnicodeString& getPositiveSuffix(UnicodeString& result) const;
00545 
00553     virtual void setPositiveSuffix(const UnicodeString& newValue);
00554 
00563     UnicodeString& getNegativeSuffix(UnicodeString& result) const;
00564 
00572     virtual void setNegativeSuffix(const UnicodeString& newValue);
00573 
00584     int32_t getMultiplier(void) const;
00585 
00596     virtual void setMultiplier(int32_t newValue);
00597 
00607     virtual double getRoundingIncrement(void);
00608 
00619     virtual void setRoundingIncrement(double newValue);
00620 
00629     virtual ERoundingMode getRoundingMode(void);
00630 
00640     virtual void setRoundingMode(ERoundingMode roundingMode);
00641 
00652     virtual int32_t getFormatWidth(void);
00653 
00667     virtual void setFormatWidth(int32_t width);
00668 
00682     virtual UnicodeString getPadCharacterString();
00683 
00698     virtual void setPadCharacter(const UnicodeString &padChar);
00699 
00718     virtual EPadPosition getPadPosition(void);
00719 
00740     virtual void setPadPosition(EPadPosition padPos);
00741 
00752     virtual UBool isScientificNotation(void);
00753 
00765     virtual void setScientificNotation(UBool useScientific);
00766 
00777     virtual int8_t getMinimumExponentDigits(void);
00778 
00791     virtual void setMinimumExponentDigits(int8_t minExpDig);
00792 
00805     virtual UBool isExponentSignAlwaysShown(void);
00806 
00820     virtual void setExponentSignAlwaysShown(UBool expSignAlways);
00821 
00833     int32_t getGroupingSize(void) const;
00834 
00846     virtual void setGroupingSize(int32_t newValue);
00847 
00866     int32_t getSecondaryGroupingSize(void) const;
00867 
00879     virtual void setSecondaryGroupingSize(int32_t newValue);
00880 
00889     UBool isDecimalSeparatorAlwaysShown(void) const;
00890 
00899     virtual void setDecimalSeparatorAlwaysShown(UBool newValue);
00900 
00911     virtual UnicodeString& toPattern(UnicodeString& result) const;
00912 
00923     virtual UnicodeString& toLocalizedPattern(UnicodeString& result) const;
00924  
00954     virtual void applyPattern(const UnicodeString& pattern,
00955                              UParseError& parseError,
00956                              UErrorCode& status);
00965     virtual void applyPattern(const UnicodeString& pattern,
00966                              UErrorCode& status);
00967 
00998     virtual void applyLocalizedPattern(const UnicodeString& pattern,
00999                                        UParseError& parseError,
01000                                        UErrorCode& status);
01001 
01011     virtual void applyLocalizedPattern(const UnicodeString& pattern,
01012                                        UErrorCode& status);
01013 
01014 
01024     virtual void setMaximumIntegerDigits(int32_t newValue);
01025 
01035     virtual void setMinimumIntegerDigits(int32_t newValue);
01036 
01046     virtual void setMaximumFractionDigits(int32_t newValue);
01047 
01057     virtual void setMinimumFractionDigits(int32_t newValue);
01058 
01069     virtual void setCurrency(const UChar* theCurrency);
01070 
01076     static const char fgNumberPatterns[];
01077 
01078 public:
01079 
01091     static inline UClassID getStaticClassID(void);
01092 
01104     virtual UClassID getDynamicClassID(void) const;
01105 
01106 private:
01107     static const char fgClassID;
01108 
01109     DecimalFormat(); // default constructor not implemented
01110 
01114     void construct(UErrorCode&               status,
01115                    UParseError&             parseErr,
01116                    const UnicodeString*     pattern = 0,
01117                    DecimalFormatSymbols*    symbolsToAdopt = 0
01118                    );
01119 
01128     UnicodeString& toPattern(UnicodeString& result, UBool localized) const;
01129 
01140     void applyPattern(const UnicodeString& pattern,
01141                             UBool localized,
01142                             UParseError& parseError,
01143                             UErrorCode& status);
01155     UnicodeString& subformat(UnicodeString& appendTo,
01156                              FieldPosition& fieldPosition,
01157                              DigitList& digits,
01158                              UBool         isInteger) const;
01159 
01160     enum {
01161         fgStatusInfinite,
01162         fgStatusLength      // Leave last in list.
01163     } StatusFlags;
01164 
01177     UBool subparse(const UnicodeString& text, ParsePosition& parsePosition,
01178                     DigitList& digits, UBool* status) const;
01179 
01180     int32_t skipPadding(const UnicodeString& text, int32_t position) const;
01181 
01182     int32_t compareAffix(const UnicodeString& input,
01183                          int32_t pos,
01184                          UBool isNegative,
01185                          UBool isPrefix) const;
01186     
01187     static int32_t compareSimpleAffix(const UnicodeString& affix,
01188                                       const UnicodeString& input,
01189                                       int32_t pos);
01190     
01191     static int32_t skipRuleWhiteSpace(const UnicodeString& text, int32_t pos);
01192     
01193     static int32_t skipUWhiteSpace(const UnicodeString& text, int32_t pos);
01194     
01195     int32_t compareComplexAffix(const UnicodeString& affixPat,
01196                                 const UnicodeString& input,
01197                                 int32_t pos) const;
01198 
01199     static int32_t match(const UnicodeString& text, int32_t pos, UChar32 ch);
01200 
01201     static int32_t match(const UnicodeString& text, int32_t pos, const UnicodeString& str);
01202 
01208     inline const UnicodeString &getConstSymbol(DecimalFormatSymbols::ENumberFormatSymbol symbol) const;
01209 
01210     int32_t appendAffix(UnicodeString& buf, double number,
01211                         UBool isNegative, UBool isPrefix) const;
01212 
01218     void appendAffixPattern(UnicodeString& appendTo, const UnicodeString& affix, 
01219                             UBool localized) const;
01220 
01221     void appendAffixPattern(UnicodeString& appendTo,
01222                             const UnicodeString* affixPattern,
01223                             const UnicodeString& expAffix, UBool localized) const;
01224 
01225     void expandAffix(const UnicodeString& pattern,
01226                      UnicodeString& affix,
01227                      double number,
01228                      UBool doFormat) const;
01229 
01230     void expandAffixes();
01231     
01232     static double round(double a, ERoundingMode mode, UBool isNegative);
01233 
01234     void addPadding(UnicodeString& appendTo,
01235                     FieldPosition& fieldPosition,
01236                     int32_t prefixLen, int32_t suffixLen) const;
01237 
01238     UBool isGroupingPosition(int32_t pos) const;
01239 
01240     void setCurrencyForSymbols();
01241 
01242     void setCurrencyForLocale(const char* locale, UErrorCode& ec);
01243 
01247     //static const int8_t fgMaxDigit; // The largest digit, in this case 9
01248 
01249     /*transient*/ //DigitList* fDigitList;
01250 
01251     UnicodeString           fPositivePrefix;
01252     UnicodeString           fPositiveSuffix;
01253     UnicodeString           fNegativePrefix;
01254     UnicodeString           fNegativeSuffix;
01255     UnicodeString*          fPosPrefixPattern;
01256     UnicodeString*          fPosSuffixPattern;
01257     UnicodeString*          fNegPrefixPattern;
01258     UnicodeString*          fNegSuffixPattern;
01259 
01265     ChoiceFormat*           fCurrencyChoice;
01266 
01267     int32_t                 fMultiplier;
01268     int32_t                 fGroupingSize;
01269     int32_t                 fGroupingSize2;
01270     UBool                  fDecimalSeparatorAlwaysShown;
01271     /*transient*/ UBool    fIsCurrencyFormat;
01272     DecimalFormatSymbols*   fSymbols;
01273 
01274     UBool                  fUseExponentialNotation;
01275     int8_t                  fMinExponentDigits;
01276     UBool                  fExponentSignAlwaysShown;
01277 
01278     /* If fRoundingIncrement is NULL, there is no rounding.  Otherwise, round to
01279      * fRoundingIncrement.getDouble().  Since this operation may be expensive,
01280      * we cache the result in fRoundingDouble.  All methods that update
01281      * fRoundingIncrement also update fRoundingDouble. */
01282     DigitList*              fRoundingIncrement;
01283     /*transient*/ double    fRoundingDouble;
01284     ERoundingMode           fRoundingMode;
01285 
01286     UChar32                 fPad;
01287     int32_t                 fFormatWidth;
01288     EPadPosition            fPadPosition;
01289 
01290     // Constants for characters used in programmatic (unlocalized) patterns.
01291     static const UChar    kPatternZeroDigit;
01292     static const UChar    kPatternGroupingSeparator;
01293     static const UChar    kPatternDecimalSeparator;
01294     static const UChar    kPatternPerMill;
01295     static const UChar    kPatternPercent;
01296     static const UChar    kPatternDigit;
01297     static const UChar    kPatternSeparator;
01298     static const UChar    kPatternExponent;
01299     static const UChar    kPatternPlus;
01300     static const UChar    kPatternMinus;
01301     static const UChar    kPatternPadEscape;
01302 
01310     static const UChar    kCurrencySign;
01311     static const UChar    kQuote;
01312 
01313 protected:
01317     static const int32_t  kDoubleIntegerDigits;
01321     static const int32_t  kDoubleFractionDigits;
01322 };
01323 
01324 inline UClassID
01325 DecimalFormat::getStaticClassID(void)
01326 { return (UClassID)&fgClassID; }
01327 
01328 inline UClassID
01329 DecimalFormat::getDynamicClassID(void) const
01330 { return DecimalFormat::getStaticClassID(); }
01331 
01332 inline UnicodeString&
01333 DecimalFormat::format(const Formattable& obj,
01334                       UnicodeString& appendTo,
01335                       UErrorCode& status) const {
01336     // Don't use Format:: - use immediate base class only,
01337     // in case immediate base modifies behavior later.
01338     return NumberFormat::format(obj, appendTo, status);
01339 }
01340 
01341 inline UnicodeString&
01342 DecimalFormat::format(double number,
01343                       UnicodeString& appendTo) const {
01344     FieldPosition pos(0);
01345     return format(number, appendTo, pos);
01346 }
01347 
01348 inline UnicodeString&
01349 DecimalFormat::format(int32_t number,
01350                       UnicodeString& appendTo) const {
01351     FieldPosition pos(0);
01352     return format(number, appendTo, pos);
01353 }
01354 
01355 inline const UnicodeString &
01356 DecimalFormat::getConstSymbol(DecimalFormatSymbols::ENumberFormatSymbol symbol) const {
01357     return fSymbols->getConstSymbol(symbol);
01358 }
01359 
01360 U_NAMESPACE_END
01361 
01362 #endif /* #if !UCONFIG_NO_FORMATTING */
01363 
01364 #endif // _DECIMFMT
01365 //eof

Generated on Wed Sep 3 17:47:08 2003 for ICU 2.6 by doxygen 1.3.2