/* ******************************************************************************** * Copyright (C) 1997-1999, International Business Machines * Corporation and others. All Rights Reserved. ******************************************************************************** * * File DECIMFMT.H * * Modification History: * * Date Name Description * 02/19/97 aliu Converted from java. * 03/20/97 clhuang Updated per C++ implementation. * 04/03/97 aliu Rewrote parsing and formatting completely, and * cleaned up and debugged. Actually works now. * 04/17/97 aliu Changed DigitCount to int per code review. * 07/10/97 helena Made ParsePosition a class and get rid of the function * hiding problems. * 09/09/97 aliu Ported over support for exponential formats. * 07/20/98 stephen Changed documentation ******************************************************************************** */ #ifndef DECIMFMT_H #define DECIMFMT_H #include "unicode/utypes.h" #include "unicode/numfmt.h" #include "unicode/locid.h" class DecimalFormatSymbols; class DigitList; class U_I18N_API DecimalFormat: public NumberFormat { public: enum ERoundingMode { kRoundCeiling, kRoundFloor, kRoundDown, kRoundUp, kRoundHalfEven, kRoundHalfDown, kRoundHalfUp // We don't support ROUND_UNNECESSARY }; enum EPadPosition { kPadBeforePrefix, kPadAfterPrefix, kPadBeforeSuffix, kPadAfterSuffix }; DecimalFormat(UErrorCode& status); DecimalFormat(const UnicodeString& pattern, UErrorCode& status); DecimalFormat( const UnicodeString& pattern, DecimalFormatSymbols* symbolsToAdopt, UErrorCode& status); DecimalFormat( const UnicodeString& pattern, const DecimalFormatSymbols& symbols, UErrorCode& status); DecimalFormat(const DecimalFormat& source); DecimalFormat& operator=(const DecimalFormat& rhs); virtual ~DecimalFormat(); virtual Format* clone(void) const; virtual bool_t operator==(const Format& other) const; virtual UnicodeString& format(double number, UnicodeString& toAppendTo, FieldPosition& pos) const; virtual UnicodeString& format(int32_t number, UnicodeString& toAppendTo, FieldPosition& pos) const; virtual UnicodeString& format(const Formattable& obj, UnicodeString& toAppendTo, FieldPosition& pos, UErrorCode& status) const; UnicodeString& format(const Formattable& obj, UnicodeString& result, UErrorCode& status) const; UnicodeString& format(double number, UnicodeString& output) const; UnicodeString& format(int32_t number, UnicodeString& output) const; virtual void parse(const UnicodeString& text, Formattable& result, ParsePosition& parsePosition) const; // Declare here again to get rid of function hiding problems. virtual void parse(const UnicodeString& text, Formattable& result, UErrorCode& error) const; virtual const DecimalFormatSymbols* getDecimalFormatSymbols(void) const; virtual void adoptDecimalFormatSymbols(DecimalFormatSymbols* symbolsToAdopt); virtual void setDecimalFormatSymbols(const DecimalFormatSymbols& symbols); UnicodeString& getPositivePrefix(UnicodeString& result) const; virtual void setPositivePrefix(const UnicodeString& newValue); UnicodeString& getNegativePrefix(UnicodeString& result) const; virtual void setNegativePrefix(const UnicodeString& newValue); UnicodeString& getPositiveSuffix(UnicodeString& result) const; virtual void setPositiveSuffix(const UnicodeString& newValue); UnicodeString& getNegativeSuffix(UnicodeString& result) const; virtual void setNegativeSuffix(const UnicodeString& newValue); int32_t getMultiplier(void) const; virtual void setMultiplier(int32_t newValue); virtual double getRoundingIncrement(void); virtual void setRoundingIncrement(double newValue); virtual ERoundingMode getRoundingMode(void); virtual void setRoundingMode(ERoundingMode roundingMode); virtual int32_t getFormatWidth(void); virtual void setFormatWidth(int32_t width); virtual UChar getPadCharacter(void); virtual void setPadCharacter(UChar padChar); virtual EPadPosition getPadPosition(void); virtual void setPadPosition(EPadPosition padPos); virtual bool_t isScientificNotation(void); virtual void setScientificNotation(bool_t useScientific); virtual int8_t getMinimumExponentDigits(void); virtual void setMinimumExponentDigits(int8_t minExpDig); virtual bool_t isExponentSignAlwaysShown(void); virtual void setExponentSignAlwaysShown(bool_t expSignAlways); int32_t getGroupingSize(void) const; virtual void setGroupingSize(int32_t newValue); bool_t isDecimalSeparatorAlwaysShown(void) const; virtual void setDecimalSeparatorAlwaysShown(bool_t newValue); virtual UnicodeString& toPattern(UnicodeString& result) const; virtual UnicodeString& toLocalizedPattern(UnicodeString& result) const; virtual void applyPattern(const UnicodeString& pattern, UErrorCode& status); virtual void applyLocalizedPattern(const UnicodeString& pattern, UErrorCode& status); virtual void setMaximumIntegerDigits(int32_t newValue); virtual void setMinimumIntegerDigits(int32_t newValue); virtual void setMaximumFractionDigits(int32_t newValue); virtual void setMinimumFractionDigits(int32_t newValue); static const char *fgNumberPatterns; public: static UClassID getStaticClassID(void) { return (UClassID)&fgClassID; } virtual UClassID getDynamicClassID(void) const { return getStaticClassID(); } private: static char fgClassID; void construct(UErrorCode& status, const UnicodeString* pattern = 0, DecimalFormatSymbols* symbolsToAdopt = 0, const Locale& locale = Locale::getDefault()); UnicodeString& toPattern(UnicodeString& result, bool_t localized) const; void applyPattern(const UnicodeString& pattern, bool_t localized, UErrorCode& status); UnicodeString& subformat(UnicodeString& result, FieldPosition& fieldPosition, bool_t isNegative, bool_t isInteger) const; static const int32_t fgStatusInfinite; static const int32_t fgStatusPositive; static const int32_t fgStatusLength; bool_t subparse(const UnicodeString& text, ParsePosition& parsePosition, DigitList& digits, bool_t isExponent, bool_t* status) const; void appendAffix(UnicodeString& buffer, const UnicodeString& affix, bool_t localized) const; void appendAffix(UnicodeString& buffer, const UnicodeString* affixPattern, const UnicodeString& expAffix, bool_t localized) const; void expandAffix(const UnicodeString& pattern, UnicodeString& affix) const; void expandAffixes(void); static double round(double a, ERoundingMode mode, bool_t isNegative); void addPadding(UnicodeString& result, bool_t hasAffixes, bool_t isNegative) const; static const int8_t fgMaxDigit; // The largest digit, in this case 9 /*transient*/ DigitList* fDigitList; UnicodeString fPositivePrefix; UnicodeString fPositiveSuffix; UnicodeString fNegativePrefix; UnicodeString fNegativeSuffix; UnicodeString* fPosPrefixPattern; UnicodeString* fPosSuffixPattern; UnicodeString* fNegPrefixPattern; UnicodeString* fNegSuffixPattern; int32_t fMultiplier; int32_t fGroupingSize; bool_t fDecimalSeparatorAlwaysShown; /*transient*/ bool_t fIsCurrencyFormat; DecimalFormatSymbols* fSymbols; bool_t fUseExponentialNotation; int8_t fMinExponentDigits; bool_t fExponentSignAlwaysShown; /* If fRoundingIncrement is NULL, there is no rounding. Otherwise, round to * fRoundingIncrement.getDouble(). Since this operation may be expensive, * we cache the result in fRoundingDouble. All methods that update * fRoundingIncrement also update fRoundingDouble. */ DigitList* fRoundingIncrement; /*transient*/ double fRoundingDouble; ERoundingMode fRoundingMode; UChar fPad; int32_t fFormatWidth; EPadPosition fPadPosition; // Constants for characters used in programmatic (unlocalized) patterns. static const UChar kPatternZeroDigit; static const UChar kPatternGroupingSeparator; static const UChar kPatternDecimalSeparator; static const UChar kPatternPerMill; static const UChar kPatternPercent; static const UChar kPatternDigit; static const UChar kPatternSeparator; static const UChar kPatternExponent; static const UChar kPatternPlus; static const UChar kPatternMinus; static const UChar kPatternPadEscape; static const UChar kCurrencySign; static const UChar kQuote; protected: static const int32_t kDoubleIntegerDigits; static const int32_t kDoubleFractionDigits; }; inline UnicodeString& DecimalFormat::format(const Formattable& obj, UnicodeString& result, UErrorCode& status) const { // Don't use Format:: - use immediate base class only, // in case immediate base modifies behavior later. return NumberFormat::format(obj, result, status); } inline UnicodeString& DecimalFormat::format(double number, UnicodeString& output) const { return NumberFormat::format(number, output); } inline UnicodeString& DecimalFormat::format(int32_t number, UnicodeString& output) const { return NumberFormat::format(number, output); } #endif // _DECIMFMT //eof