00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef DECIMFMT_H
00025 #define DECIMFMT_H
00026
00027 #include "unicode/utypes.h"
00033 #if !UCONFIG_NO_FORMATTING
00034
00035 #include "unicode/dcfmtsym.h"
00036 #include "unicode/numfmt.h"
00037 #include "unicode/locid.h"
00038
00039 union UHashTok;
00040
00041 U_NAMESPACE_BEGIN
00042
00043
00044 U_CDECL_BEGIN
00045
00049 static UBool U_CALLCONV AffixValueComparator(UHashTok val1, UHashTok val2) ;
00050
00054 static UBool U_CALLCONV AffixPatternValueComparator(UHashTok val1, UHashTok val2) ;
00055
00056 U_CDECL_END
00057
00058 class DigitList;
00059 class ChoiceFormat;
00060 class CurrencyPluralInfo;
00061 class Hashtable;
00062
00651 class U_I18N_API DecimalFormat: public NumberFormat {
00652 public:
00657 enum ERoundingMode {
00658 kRoundCeiling,
00659 kRoundFloor,
00660 kRoundDown,
00661 kRoundUp,
00662 kRoundHalfEven,
00664 kRoundHalfDown,
00666 kRoundHalfUp
00668
00669 };
00670
00675 enum EPadPosition {
00676 kPadBeforePrefix,
00677 kPadAfterPrefix,
00678 kPadBeforeSuffix,
00679 kPadAfterSuffix
00680 };
00681
00695 DecimalFormat(UErrorCode& status);
00696
00711 DecimalFormat(const UnicodeString& pattern,
00712 UErrorCode& status);
00713
00732 DecimalFormat( const UnicodeString& pattern,
00733 DecimalFormatSymbols* symbolsToAdopt,
00734 UErrorCode& status);
00735
00748 DecimalFormat( const UnicodeString& pattern,
00749 DecimalFormatSymbols* symbolsToAdopt,
00750 NumberFormat::EStyles style,
00751 UErrorCode& status);
00752
00772 DecimalFormat( const UnicodeString& pattern,
00773 DecimalFormatSymbols* symbolsToAdopt,
00774 UParseError& parseError,
00775 UErrorCode& status);
00793 DecimalFormat( const UnicodeString& pattern,
00794 const DecimalFormatSymbols& symbols,
00795 UErrorCode& status);
00796
00803 DecimalFormat(const DecimalFormat& source);
00804
00811 DecimalFormat& operator=(const DecimalFormat& rhs);
00812
00817 virtual ~DecimalFormat();
00818
00826 virtual Format* clone(void) const;
00827
00836 virtual UBool operator==(const Format& other) const;
00837
00849 virtual UnicodeString& format(double number,
00850 UnicodeString& appendTo,
00851 FieldPosition& pos) const;
00863 virtual UnicodeString& format(int32_t number,
00864 UnicodeString& appendTo,
00865 FieldPosition& pos) const;
00877 virtual UnicodeString& format(int64_t number,
00878 UnicodeString& appendTo,
00879 FieldPosition& pos) const;
00880
00893 virtual UnicodeString& format(const Formattable& obj,
00894 UnicodeString& appendTo,
00895 FieldPosition& pos,
00896 UErrorCode& status) const;
00897
00909 UnicodeString& format(const Formattable& obj,
00910 UnicodeString& appendTo,
00911 UErrorCode& status) const;
00912
00923 UnicodeString& format(double number,
00924 UnicodeString& appendTo) const;
00925
00937 UnicodeString& format(int32_t number,
00938 UnicodeString& appendTo) const;
00939
00951 UnicodeString& format(int64_t number,
00952 UnicodeString& appendTo) const;
00972 virtual void parse(const UnicodeString& text,
00973 Formattable& result,
00974 ParsePosition& parsePosition) const;
00975
00976
00985 virtual void parse(const UnicodeString& text,
00986 Formattable& result,
00987 UErrorCode& status) const;
00988
01008 virtual Formattable& parseCurrency(const UnicodeString& text,
01009 Formattable& result,
01010 ParsePosition& pos) const;
01011
01019 virtual const DecimalFormatSymbols* getDecimalFormatSymbols(void) const;
01020
01027 virtual void adoptDecimalFormatSymbols(DecimalFormatSymbols* symbolsToAdopt);
01028
01035 virtual void setDecimalFormatSymbols(const DecimalFormatSymbols& symbols);
01036
01037
01044 virtual const CurrencyPluralInfo* getCurrencyPluralInfo(void) const;
01045
01052 virtual void adoptCurrencyPluralInfo(CurrencyPluralInfo* toAdopt);
01053
01060 virtual void setCurrencyPluralInfo(const CurrencyPluralInfo& info);
01061
01062
01071 UnicodeString& getPositivePrefix(UnicodeString& result) const;
01072
01080 virtual void setPositivePrefix(const UnicodeString& newValue);
01081
01090 UnicodeString& getNegativePrefix(UnicodeString& result) const;
01091
01099 virtual void setNegativePrefix(const UnicodeString& newValue);
01100
01109 UnicodeString& getPositiveSuffix(UnicodeString& result) const;
01110
01118 virtual void setPositiveSuffix(const UnicodeString& newValue);
01119
01128 UnicodeString& getNegativeSuffix(UnicodeString& result) const;
01129
01137 virtual void setNegativeSuffix(const UnicodeString& newValue);
01138
01149 int32_t getMultiplier(void) const;
01150
01161 virtual void setMultiplier(int32_t newValue);
01162
01172 virtual double getRoundingIncrement(void) const;
01173
01184 virtual void setRoundingIncrement(double newValue);
01185
01194 virtual ERoundingMode getRoundingMode(void) const;
01195
01205 virtual void setRoundingMode(ERoundingMode roundingMode);
01206
01218 virtual int32_t getFormatWidth(void) const;
01219
01234 virtual void setFormatWidth(int32_t width);
01235
01248 virtual UnicodeString getPadCharacterString() const;
01249
01264 virtual void setPadCharacter(const UnicodeString &padChar);
01265
01281 virtual EPadPosition getPadPosition(void) const;
01282
01299 virtual void setPadPosition(EPadPosition padPos);
01300
01311 virtual UBool isScientificNotation(void);
01312
01328 virtual void setScientificNotation(UBool useScientific);
01329
01340 virtual int8_t getMinimumExponentDigits(void) const;
01341
01354 virtual void setMinimumExponentDigits(int8_t minExpDig);
01355
01368 virtual UBool isExponentSignAlwaysShown(void);
01369
01383 virtual void setExponentSignAlwaysShown(UBool expSignAlways);
01384
01396 int32_t getGroupingSize(void) const;
01397
01409 virtual void setGroupingSize(int32_t newValue);
01410
01429 int32_t getSecondaryGroupingSize(void) const;
01430
01442 virtual void setSecondaryGroupingSize(int32_t newValue);
01443
01452 UBool isDecimalSeparatorAlwaysShown(void) const;
01453
01462 virtual void setDecimalSeparatorAlwaysShown(UBool newValue);
01463
01474 virtual UnicodeString& toPattern(UnicodeString& result) const;
01475
01486 virtual UnicodeString& toLocalizedPattern(UnicodeString& result) const;
01487
01517 virtual void applyPattern(const UnicodeString& pattern,
01518 UParseError& parseError,
01519 UErrorCode& status);
01528 virtual void applyPattern(const UnicodeString& pattern,
01529 UErrorCode& status);
01530
01561 virtual void applyLocalizedPattern(const UnicodeString& pattern,
01562 UParseError& parseError,
01563 UErrorCode& status);
01564
01574 virtual void applyLocalizedPattern(const UnicodeString& pattern,
01575 UErrorCode& status);
01576
01577
01587 virtual void setMaximumIntegerDigits(int32_t newValue);
01588
01598 virtual void setMinimumIntegerDigits(int32_t newValue);
01599
01609 virtual void setMaximumFractionDigits(int32_t newValue);
01610
01620 virtual void setMinimumFractionDigits(int32_t newValue);
01621
01629 int32_t getMinimumSignificantDigits() const;
01630
01638 int32_t getMaximumSignificantDigits() const;
01639
01649 void setMinimumSignificantDigits(int32_t min);
01650
01661 void setMaximumSignificantDigits(int32_t max);
01662
01669 UBool areSignificantDigitsUsed() const;
01670
01678 void setSignificantDigitsUsed(UBool useSignificantDigits);
01679
01680 public:
01693 virtual void setCurrency(const UChar* theCurrency, UErrorCode& ec);
01694
01700 virtual void setCurrency(const UChar* theCurrency);
01701
01707 static const char fgNumberPatterns[];
01708
01709 public:
01710
01722 static UClassID U_EXPORT2 getStaticClassID(void);
01723
01735 virtual UClassID getDynamicClassID(void) const;
01736
01737 private:
01738 friend UBool U_CALLCONV AffixValueComparator(UHashTok val1, UHashTok val2);
01739 friend UBool U_CALLCONV AffixPatternValueComparator(UHashTok val1, UHashTok val2);
01740
01741 DecimalFormat();
01742
01743 int32_t precision(UBool isIntegral) const;
01744
01748 void construct(UErrorCode& status,
01749 UParseError& parseErr,
01750 const UnicodeString* pattern = 0,
01751 DecimalFormatSymbols* symbolsToAdopt = 0
01752 );
01753
01762 UnicodeString& toPattern(UnicodeString& result, UBool localized) const;
01763
01774 void applyPattern(const UnicodeString& pattern,
01775 UBool localized,
01776 UParseError& parseError,
01777 UErrorCode& status);
01778
01779
01780
01781
01782 void applyPatternInternally(const UnicodeString& pluralCount,
01783 const UnicodeString& pattern,
01784 UBool localized,
01785 UParseError& parseError,
01786 UErrorCode& status);
01787
01788
01789
01790
01791 void applyPatternWithoutExpandAffix(const UnicodeString& pattern,
01792 UBool localized,
01793 UParseError& parseError,
01794 UErrorCode& status);
01795
01796
01797
01798
01799
01800 void expandAffixAdjustWidth(const UnicodeString* pluralCount);
01801
01802
01814 UnicodeString& subformat(UnicodeString& appendTo,
01815 FieldPosition& fieldPosition,
01816 DigitList& digits,
01817 UBool isInteger) const;
01818
01819
01820 void parse(const UnicodeString& text,
01821 Formattable& result,
01822 ParsePosition& pos,
01823 UBool parseCurrency) const;
01824
01825 enum {
01826 fgStatusInfinite,
01827 fgStatusLength
01828 } StatusFlags;
01829
01830 UBool subparse(const UnicodeString& text,
01831 const UnicodeString* negPrefix,
01832 const UnicodeString* negSuffix,
01833 const UnicodeString* posPrefix,
01834 const UnicodeString* posSuffix,
01835 UBool currencyParsing,
01836 int8_t type,
01837 ParsePosition& parsePosition,
01838 DigitList& digits, UBool* status,
01839 UChar* currency) const;
01840
01841
01842
01843
01844
01845
01846 UBool parseForCurrency(const UnicodeString& text,
01847 ParsePosition& parsePosition,
01848 DigitList& digits,
01849 UBool* status,
01850 UChar* currency) const;
01851
01852 int32_t skipPadding(const UnicodeString& text, int32_t position) const;
01853
01854 int32_t compareAffix(const UnicodeString& input,
01855 int32_t pos,
01856 UBool isNegative,
01857 UBool isPrefix,
01858 const UnicodeString* affixPat,
01859 UBool currencyParsing,
01860 int8_t type,
01861 UChar* currency) const;
01862
01863 static int32_t compareSimpleAffix(const UnicodeString& affix,
01864 const UnicodeString& input,
01865 int32_t pos);
01866
01867 static int32_t skipRuleWhiteSpace(const UnicodeString& text, int32_t pos);
01868
01869 static int32_t skipUWhiteSpace(const UnicodeString& text, int32_t pos);
01870
01871 int32_t compareComplexAffix(const UnicodeString& affixPat,
01872 const UnicodeString& input,
01873 int32_t pos,
01874 int8_t type,
01875 UChar* currency) const;
01876
01877 static int32_t match(const UnicodeString& text, int32_t pos, UChar32 ch);
01878
01879 static int32_t match(const UnicodeString& text, int32_t pos, const UnicodeString& str);
01880
01886 inline const UnicodeString &getConstSymbol(DecimalFormatSymbols::ENumberFormatSymbol symbol) const;
01887
01888 int32_t appendAffix(UnicodeString& buf, double number,
01889 UBool isNegative, UBool isPrefix) const;
01890
01896 void appendAffixPattern(UnicodeString& appendTo, const UnicodeString& affix,
01897 UBool localized) const;
01898
01899 void appendAffixPattern(UnicodeString& appendTo,
01900 const UnicodeString* affixPattern,
01901 const UnicodeString& expAffix, UBool localized) const;
01902
01903 void expandAffix(const UnicodeString& pattern,
01904 UnicodeString& affix,
01905 double number,
01906 UBool doFormat,
01907 const UnicodeString* pluralCount) const;
01908
01909 void expandAffixes(const UnicodeString* pluralCount);
01910
01911 static double round(double a, ERoundingMode mode, UBool isNegative);
01912
01913 void addPadding(UnicodeString& appendTo,
01914 FieldPosition& fieldPosition,
01915 int32_t prefixLen, int32_t suffixLen) const;
01916
01917 UBool isGroupingPosition(int32_t pos) const;
01918
01919 void setCurrencyForSymbols();
01920
01921
01922
01923
01924
01925 virtual void setCurrencyInternally(const UChar* theCurrency, UErrorCode& ec);
01926
01927
01928
01929
01930
01931 void setupCurrencyAffixPatterns(UErrorCode& status);
01932
01933
01934
01935
01936
01937 void setupCurrencyAffixes(const UnicodeString& pattern,
01938 UBool setupForCurrentPattern,
01939 UBool setupForPluralPattern,
01940 UErrorCode& status);
01941
01942
01943 Hashtable* initHashForAffixPattern(UErrorCode& status);
01944 Hashtable* initHashForAffix(UErrorCode& status);
01945
01946 void deleteHashForAffixPattern();
01947 void deleteHashForAffix(Hashtable*& table);
01948
01949 void copyHashForAffixPattern(const Hashtable* source,
01950 Hashtable* target, UErrorCode& status);
01951 void copyHashForAffix(const Hashtable* source,
01952 Hashtable* target, UErrorCode& status);
01953
01954
01955 enum {
01956 fgCurrencySignCountZero,
01957 fgCurrencySignCountInSymbolFormat,
01958 fgCurrencySignCountInISOFormat,
01959 fgCurrencySignCountInPluralFormat
01960 } CurrencySignCount;
01961
01965
01966
01967
01968
01969 UnicodeString fPositivePrefix;
01970 UnicodeString fPositiveSuffix;
01971 UnicodeString fNegativePrefix;
01972 UnicodeString fNegativeSuffix;
01973 UnicodeString* fPosPrefixPattern;
01974 UnicodeString* fPosSuffixPattern;
01975 UnicodeString* fNegPrefixPattern;
01976 UnicodeString* fNegSuffixPattern;
01977
01983 ChoiceFormat* fCurrencyChoice;
01984
01985 int32_t fMultiplier;
01986 int32_t fGroupingSize;
01987 int32_t fGroupingSize2;
01988 UBool fDecimalSeparatorAlwaysShown;
01989 DecimalFormatSymbols* fSymbols;
01990
01991 UBool fUseSignificantDigits;
01992 int32_t fMinSignificantDigits;
01993 int32_t fMaxSignificantDigits;
01994
01995 UBool fUseExponentialNotation;
01996 int8_t fMinExponentDigits;
01997 UBool fExponentSignAlwaysShown;
01998
01999
02000
02001
02002
02003 DigitList* fRoundingIncrement;
02004 double fRoundingDouble;
02005 ERoundingMode fRoundingMode;
02006
02007 UChar32 fPad;
02008 int32_t fFormatWidth;
02009 EPadPosition fPadPosition;
02010
02011
02012
02013
02014
02015 UnicodeString fFormatPattern;
02016
02017
02018 int fStyle;
02019
02020
02021
02022
02023
02024
02025
02026
02027
02028
02029 int fCurrencySignCount;
02030
02031
02032
02033
02034
02035
02036
02037
02038
02039 struct AffixPatternsForCurrency : public UMemory {
02040
02041 UnicodeString negPrefixPatternForCurrency;
02042
02043 UnicodeString negSuffixPatternForCurrency;
02044
02045 UnicodeString posPrefixPatternForCurrency;
02046
02047 UnicodeString posSuffixPatternForCurrency;
02048 int8_t patternType;
02049
02050 AffixPatternsForCurrency(const UnicodeString& negPrefix,
02051 const UnicodeString& negSuffix,
02052 const UnicodeString& posPrefix,
02053 const UnicodeString& posSuffix,
02054 int8_t type) {
02055 negPrefixPatternForCurrency = negPrefix;
02056 negSuffixPatternForCurrency = negSuffix;
02057 posPrefixPatternForCurrency = posPrefix;
02058 posSuffixPatternForCurrency = posSuffix;
02059 patternType = type;
02060 }
02061 };
02062
02063
02064
02065
02066
02067 struct AffixesForCurrency : public UMemory {
02068
02069 UnicodeString negPrefixForCurrency;
02070
02071 UnicodeString negSuffixForCurrency;
02072
02073 UnicodeString posPrefixForCurrency;
02074
02075 UnicodeString posSuffixForCurrency;
02076
02077 int32_t formatWidth;
02078
02079 AffixesForCurrency(const UnicodeString& negPrefix,
02080 const UnicodeString& negSuffix,
02081 const UnicodeString& posPrefix,
02082 const UnicodeString& posSuffix) {
02083 negPrefixForCurrency = negPrefix;
02084 negSuffixForCurrency = negSuffix;
02085 posPrefixForCurrency = posPrefix;
02086 posSuffixForCurrency = posSuffix;
02087 }
02088 };
02089
02090
02091
02092
02093
02094
02095
02096
02097
02098
02099
02100
02101
02102
02103 Hashtable* fAffixPatternsForCurrency;
02104
02105
02106
02107
02108
02109
02110
02111
02112 Hashtable* fAffixesForCurrency;
02113 Hashtable* fPluralAffixesForCurrency;
02114
02115
02116 CurrencyPluralInfo* fCurrencyPluralInfo;
02117
02118 protected:
02119
02128 virtual void getEffectiveCurrency(UChar* result, UErrorCode& ec) const;
02129
02133 static const int32_t kDoubleIntegerDigits;
02137 static const int32_t kDoubleFractionDigits;
02138
02149 static const int32_t kMaxScientificIntegerDigits;
02150 };
02151
02152 inline UnicodeString&
02153 DecimalFormat::format(const Formattable& obj,
02154 UnicodeString& appendTo,
02155 UErrorCode& status) const {
02156
02157
02158 return NumberFormat::format(obj, appendTo, status);
02159 }
02160
02161 inline UnicodeString&
02162 DecimalFormat::format(double number,
02163 UnicodeString& appendTo) const {
02164 FieldPosition pos(0);
02165 return format(number, appendTo, pos);
02166 }
02167
02168 inline UnicodeString&
02169 DecimalFormat::format(int32_t number,
02170 UnicodeString& appendTo) const {
02171 FieldPosition pos(0);
02172 return format((int64_t)number, appendTo, pos);
02173 }
02174
02175 inline const UnicodeString &
02176 DecimalFormat::getConstSymbol(DecimalFormatSymbols::ENumberFormatSymbol symbol) const {
02177 return fSymbols->getConstSymbol(symbol);
02178 }
02179
02180 U_NAMESPACE_END
02181
02182 #endif
02183
02184 #endif // _DECIMFMT
02185