decimfmt.h

Go to the documentation of this file.
00001 /* 00002 ******************************************************************************** 00003 * Copyright (C) 1997-2004, 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 00599 class U_I18N_API DecimalFormat: public NumberFormat { 00600 public: 00605 enum ERoundingMode { 00606 kRoundCeiling, 00607 kRoundFloor, 00608 kRoundDown, 00609 kRoundUp, 00610 kRoundHalfEven, 00612 kRoundHalfDown, 00614 kRoundHalfUp 00616 // We don't support ROUND_UNNECESSARY 00617 }; 00618 00623 enum EPadPosition { 00624 kPadBeforePrefix, 00625 kPadAfterPrefix, 00626 kPadBeforeSuffix, 00627 kPadAfterSuffix 00628 }; 00629 00643 DecimalFormat(UErrorCode& status); 00644 00659 DecimalFormat(const UnicodeString& pattern, 00660 UErrorCode& status); 00661 00680 DecimalFormat( const UnicodeString& pattern, 00681 DecimalFormatSymbols* symbolsToAdopt, 00682 UErrorCode& status); 00683 00703 DecimalFormat( const UnicodeString& pattern, 00704 DecimalFormatSymbols* symbolsToAdopt, 00705 UParseError& parseError, 00706 UErrorCode& status); 00724 DecimalFormat( const UnicodeString& pattern, 00725 const DecimalFormatSymbols& symbols, 00726 UErrorCode& status); 00727 00734 DecimalFormat(const DecimalFormat& source); 00735 00742 DecimalFormat& operator=(const DecimalFormat& rhs); 00743 00748 virtual ~DecimalFormat(); 00749 00757 virtual Format* clone(void) const; 00758 00767 virtual UBool operator==(const Format& other) const; 00768 00780 virtual UnicodeString& format(double number, 00781 UnicodeString& appendTo, 00782 FieldPosition& pos) const; 00794 virtual UnicodeString& format(int32_t number, 00795 UnicodeString& appendTo, 00796 FieldPosition& pos) const; 00808 virtual UnicodeString& format(int64_t number, 00809 UnicodeString& appendTo, 00810 FieldPosition& pos) const; 00811 00824 virtual UnicodeString& format(const Formattable& obj, 00825 UnicodeString& appendTo, 00826 FieldPosition& pos, 00827 UErrorCode& status) const; 00828 00840 UnicodeString& format(const Formattable& obj, 00841 UnicodeString& appendTo, 00842 UErrorCode& status) const; 00843 00854 UnicodeString& format(double number, 00855 UnicodeString& appendTo) const; 00856 00868 UnicodeString& format(int32_t number, 00869 UnicodeString& appendTo) const; 00870 00882 UnicodeString& format(int64_t number, 00883 UnicodeString& appendTo) const; 00903 virtual void parse(const UnicodeString& text, 00904 Formattable& result, 00905 ParsePosition& parsePosition) const; 00906 00907 // Declare here again to get rid of function hiding problems. 00916 virtual void parse(const UnicodeString& text, 00917 Formattable& result, 00918 UErrorCode& status) const; 00919 00939 virtual Formattable& parseCurrency(const UnicodeString& text, 00940 Formattable& result, 00941 ParsePosition& pos) const; 00942 00950 virtual const DecimalFormatSymbols* getDecimalFormatSymbols(void) const; 00951 00958 virtual void adoptDecimalFormatSymbols(DecimalFormatSymbols* symbolsToAdopt); 00959 00966 virtual void setDecimalFormatSymbols(const DecimalFormatSymbols& symbols); 00967 00968 00977 UnicodeString& getPositivePrefix(UnicodeString& result) const; 00978 00986 virtual void setPositivePrefix(const UnicodeString& newValue); 00987 00996 UnicodeString& getNegativePrefix(UnicodeString& result) const; 00997 01005 virtual void setNegativePrefix(const UnicodeString& newValue); 01006 01015 UnicodeString& getPositiveSuffix(UnicodeString& result) const; 01016 01024 virtual void setPositiveSuffix(const UnicodeString& newValue); 01025 01034 UnicodeString& getNegativeSuffix(UnicodeString& result) const; 01035 01043 virtual void setNegativeSuffix(const UnicodeString& newValue); 01044 01055 int32_t getMultiplier(void) const; 01056 01067 virtual void setMultiplier(int32_t newValue); 01068 01078 virtual double getRoundingIncrement(void) const; 01079 01090 virtual void setRoundingIncrement(double newValue); 01091 01100 virtual ERoundingMode getRoundingMode(void) const; 01101 01111 virtual void setRoundingMode(ERoundingMode roundingMode); 01112 01124 virtual int32_t getFormatWidth(void) const; 01125 01140 virtual void setFormatWidth(int32_t width); 01141 01154 virtual UnicodeString getPadCharacterString() const; 01155 01170 virtual void setPadCharacter(const UnicodeString &padChar); 01171 01190 virtual EPadPosition getPadPosition(void) const; 01191 01211 virtual void setPadPosition(EPadPosition padPos); 01212 01223 virtual UBool isScientificNotation(void); 01224 01240 virtual void setScientificNotation(UBool useScientific); 01241 01252 virtual int8_t getMinimumExponentDigits(void) const; 01253 01266 virtual void setMinimumExponentDigits(int8_t minExpDig); 01267 01280 virtual UBool isExponentSignAlwaysShown(void); 01281 01295 virtual void setExponentSignAlwaysShown(UBool expSignAlways); 01296 01308 int32_t getGroupingSize(void) const; 01309 01321 virtual void setGroupingSize(int32_t newValue); 01322 01341 int32_t getSecondaryGroupingSize(void) const; 01342 01354 virtual void setSecondaryGroupingSize(int32_t newValue); 01355 01364 UBool isDecimalSeparatorAlwaysShown(void) const; 01365 01374 virtual void setDecimalSeparatorAlwaysShown(UBool newValue); 01375 01386 virtual UnicodeString& toPattern(UnicodeString& result) const; 01387 01398 virtual UnicodeString& toLocalizedPattern(UnicodeString& result) const; 01399 01429 virtual void applyPattern(const UnicodeString& pattern, 01430 UParseError& parseError, 01431 UErrorCode& status); 01440 virtual void applyPattern(const UnicodeString& pattern, 01441 UErrorCode& status); 01442 01473 virtual void applyLocalizedPattern(const UnicodeString& pattern, 01474 UParseError& parseError, 01475 UErrorCode& status); 01476 01486 virtual void applyLocalizedPattern(const UnicodeString& pattern, 01487 UErrorCode& status); 01488 01489 01499 virtual void setMaximumIntegerDigits(int32_t newValue); 01500 01510 virtual void setMinimumIntegerDigits(int32_t newValue); 01511 01521 virtual void setMaximumFractionDigits(int32_t newValue); 01522 01532 virtual void setMinimumFractionDigits(int32_t newValue); 01533 01541 int32_t getMinimumSignificantDigits() const; 01542 01550 int32_t getMaximumSignificantDigits() const; 01551 01561 void setMinimumSignificantDigits(int32_t min); 01562 01573 void setMaximumSignificantDigits(int32_t max); 01574 01581 UBool areSignificantDigitsUsed() const; 01582 01590 void setSignificantDigitsUsed(UBool useSignificantDigits); 01591 01592 public: 01605 virtual void setCurrency(const UChar* theCurrency, UErrorCode& ec); 01606 01612 virtual void setCurrency(const UChar* theCurrency); 01613 01619 static const char fgNumberPatterns[]; 01620 01621 public: 01622 01634 static UClassID getStaticClassID(void); 01635 01647 virtual UClassID getDynamicClassID(void) const; 01648 01649 private: 01650 DecimalFormat(); // default constructor not implemented 01651 01652 int32_t precision(UBool isIntegral) const; 01653 01657 void construct(UErrorCode& status, 01658 UParseError& parseErr, 01659 const UnicodeString* pattern = 0, 01660 DecimalFormatSymbols* symbolsToAdopt = 0 01661 ); 01662 01671 UnicodeString& toPattern(UnicodeString& result, UBool localized) const; 01672 01683 void applyPattern(const UnicodeString& pattern, 01684 UBool localized, 01685 UParseError& parseError, 01686 UErrorCode& status); 01698 UnicodeString& subformat(UnicodeString& appendTo, 01699 FieldPosition& fieldPosition, 01700 DigitList& digits, 01701 UBool isInteger) const; 01702 01703 void parse(const UnicodeString& text, 01704 Formattable& result, 01705 ParsePosition& pos, 01706 UBool parseCurrency) const; 01707 01708 enum { 01709 fgStatusInfinite, 01710 fgStatusLength // Leave last in list. 01711 } StatusFlags; 01712 01713 UBool subparse(const UnicodeString& text, ParsePosition& parsePosition, 01714 DigitList& digits, UBool* status, 01715 UChar* currency) const; 01716 01717 int32_t skipPadding(const UnicodeString& text, int32_t position) const; 01718 01719 int32_t compareAffix(const UnicodeString& input, 01720 int32_t pos, 01721 UBool isNegative, 01722 UBool isPrefix, 01723 UChar* currency) const; 01724 01725 static int32_t compareSimpleAffix(const UnicodeString& affix, 01726 const UnicodeString& input, 01727 int32_t pos); 01728 01729 static int32_t skipRuleWhiteSpace(const UnicodeString& text, int32_t pos); 01730 01731 static int32_t skipUWhiteSpace(const UnicodeString& text, int32_t pos); 01732 01733 int32_t compareComplexAffix(const UnicodeString& affixPat, 01734 const UnicodeString& input, 01735 int32_t pos, 01736 UChar* currency) const; 01737 01738 static int32_t match(const UnicodeString& text, int32_t pos, UChar32 ch); 01739 01740 static int32_t match(const UnicodeString& text, int32_t pos, const UnicodeString& str); 01741 01747 inline const UnicodeString &getConstSymbol(DecimalFormatSymbols::ENumberFormatSymbol symbol) const; 01748 01749 int32_t appendAffix(UnicodeString& buf, double number, 01750 UBool isNegative, UBool isPrefix) const; 01751 01757 void appendAffixPattern(UnicodeString& appendTo, const UnicodeString& affix, 01758 UBool localized) const; 01759 01760 void appendAffixPattern(UnicodeString& appendTo, 01761 const UnicodeString* affixPattern, 01762 const UnicodeString& expAffix, UBool localized) const; 01763 01764 void expandAffix(const UnicodeString& pattern, 01765 UnicodeString& affix, 01766 double number, 01767 UBool doFormat) const; 01768 01769 void expandAffixes(); 01770 01771 static double round(double a, ERoundingMode mode, UBool isNegative); 01772 01773 void addPadding(UnicodeString& appendTo, 01774 FieldPosition& fieldPosition, 01775 int32_t prefixLen, int32_t suffixLen) const; 01776 01777 UBool isGroupingPosition(int32_t pos) const; 01778 01779 void setCurrencyForSymbols(); 01780 01781 void setCurrencyForLocale(const char* locale, UErrorCode& ec); 01782 01786 //static const int8_t fgMaxDigit; // The largest digit, in this case 9 01787 01788 /*transient*/ //DigitList* fDigitList; 01789 01790 UnicodeString fPositivePrefix; 01791 UnicodeString fPositiveSuffix; 01792 UnicodeString fNegativePrefix; 01793 UnicodeString fNegativeSuffix; 01794 UnicodeString* fPosPrefixPattern; 01795 UnicodeString* fPosSuffixPattern; 01796 UnicodeString* fNegPrefixPattern; 01797 UnicodeString* fNegSuffixPattern; 01798 01804 ChoiceFormat* fCurrencyChoice; 01805 01806 int32_t fMultiplier; 01807 int32_t fGroupingSize; 01808 int32_t fGroupingSize2; 01809 UBool fDecimalSeparatorAlwaysShown; 01810 /*transient*/ UBool fIsCurrencyFormat; 01811 DecimalFormatSymbols* fSymbols; 01812 01813 UBool fUseSignificantDigits; 01814 int32_t fMinSignificantDigits; 01815 int32_t fMaxSignificantDigits; 01816 01817 UBool fUseExponentialNotation; 01818 int8_t fMinExponentDigits; 01819 UBool fExponentSignAlwaysShown; 01820 01821 /* If fRoundingIncrement is NULL, there is no rounding. Otherwise, round to 01822 * fRoundingIncrement.getDouble(). Since this operation may be expensive, 01823 * we cache the result in fRoundingDouble. All methods that update 01824 * fRoundingIncrement also update fRoundingDouble. */ 01825 DigitList* fRoundingIncrement; 01826 /*transient*/ double fRoundingDouble; 01827 ERoundingMode fRoundingMode; 01828 01829 UChar32 fPad; 01830 int32_t fFormatWidth; 01831 EPadPosition fPadPosition; 01832 01833 protected: 01834 01843 virtual void getEffectiveCurrency(UChar* result, UErrorCode& ec) const; 01844 01848 static const int32_t kDoubleIntegerDigits; 01852 static const int32_t kDoubleFractionDigits; 01853 01864 static const int32_t kMaxScientificIntegerDigits; 01865 }; 01866 01867 inline UnicodeString& 01868 DecimalFormat::format(const Formattable& obj, 01869 UnicodeString& appendTo, 01870 UErrorCode& status) const { 01871 // Don't use Format:: - use immediate base class only, 01872 // in case immediate base modifies behavior later. 01873 return NumberFormat::format(obj, appendTo, status); 01874 } 01875 01876 inline UnicodeString& 01877 DecimalFormat::format(double number, 01878 UnicodeString& appendTo) const { 01879 FieldPosition pos(0); 01880 return format(number, appendTo, pos); 01881 } 01882 01883 inline UnicodeString& 01884 DecimalFormat::format(int32_t number, 01885 UnicodeString& appendTo) const { 01886 FieldPosition pos(0); 01887 return format((int64_t)number, appendTo, pos); 01888 } 01889 01890 inline const UnicodeString & 01891 DecimalFormat::getConstSymbol(DecimalFormatSymbols::ENumberFormatSymbol symbol) const { 01892 return fSymbols->getConstSymbol(symbol); 01893 } 01894 01895 U_NAMESPACE_END 01896 01897 #endif /* #if !UCONFIG_NO_FORMATTING */ 01898 01899 #endif // _DECIMFMT 01900 //eof

Generated on Fri Jun 18 12:35:57 2004 for ICU by doxygen 1.3.7