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 U_NAMESPACE_BEGIN
00040
00041 class DigitList;
00042 class ChoiceFormat;
00043
00603 class U_I18N_API DecimalFormat: public NumberFormat {
00604 public:
00609 enum ERoundingMode {
00610 kRoundCeiling,
00611 kRoundFloor,
00612 kRoundDown,
00613 kRoundUp,
00614 kRoundHalfEven,
00616 kRoundHalfDown,
00618 kRoundHalfUp
00620
00621 };
00622
00627 enum EPadPosition {
00628 kPadBeforePrefix,
00629 kPadAfterPrefix,
00630 kPadBeforeSuffix,
00631 kPadAfterSuffix
00632 };
00633
00647 DecimalFormat(UErrorCode& status);
00648
00663 DecimalFormat(const UnicodeString& pattern,
00664 UErrorCode& status);
00665
00684 DecimalFormat( const UnicodeString& pattern,
00685 DecimalFormatSymbols* symbolsToAdopt,
00686 UErrorCode& status);
00687
00707 DecimalFormat( const UnicodeString& pattern,
00708 DecimalFormatSymbols* symbolsToAdopt,
00709 UParseError& parseError,
00710 UErrorCode& status);
00728 DecimalFormat( const UnicodeString& pattern,
00729 const DecimalFormatSymbols& symbols,
00730 UErrorCode& status);
00731
00738 DecimalFormat(const DecimalFormat& source);
00739
00746 DecimalFormat& operator=(const DecimalFormat& rhs);
00747
00752 virtual ~DecimalFormat();
00753
00761 virtual Format* clone(void) const;
00762
00771 virtual UBool operator==(const Format& other) const;
00772
00784 virtual UnicodeString& format(double number,
00785 UnicodeString& appendTo,
00786 FieldPosition& pos) const;
00798 virtual UnicodeString& format(int32_t number,
00799 UnicodeString& appendTo,
00800 FieldPosition& pos) const;
00812 virtual UnicodeString& format(int64_t number,
00813 UnicodeString& appendTo,
00814 FieldPosition& pos) const;
00815
00828 virtual UnicodeString& format(const Formattable& obj,
00829 UnicodeString& appendTo,
00830 FieldPosition& pos,
00831 UErrorCode& status) const;
00832
00844 UnicodeString& format(const Formattable& obj,
00845 UnicodeString& appendTo,
00846 UErrorCode& status) const;
00847
00858 UnicodeString& format(double number,
00859 UnicodeString& appendTo) const;
00860
00872 UnicodeString& format(int32_t number,
00873 UnicodeString& appendTo) const;
00874
00886 UnicodeString& format(int64_t number,
00887 UnicodeString& appendTo) const;
00907 virtual void parse(const UnicodeString& text,
00908 Formattable& result,
00909 ParsePosition& parsePosition) const;
00910
00911
00920 virtual void parse(const UnicodeString& text,
00921 Formattable& result,
00922 UErrorCode& status) const;
00923
00943 virtual Formattable& parseCurrency(const UnicodeString& text,
00944 Formattable& result,
00945 ParsePosition& pos) const;
00946
00954 virtual const DecimalFormatSymbols* getDecimalFormatSymbols(void) const;
00955
00962 virtual void adoptDecimalFormatSymbols(DecimalFormatSymbols* symbolsToAdopt);
00963
00970 virtual void setDecimalFormatSymbols(const DecimalFormatSymbols& symbols);
00971
00972
00981 UnicodeString& getPositivePrefix(UnicodeString& result) const;
00982
00990 virtual void setPositivePrefix(const UnicodeString& newValue);
00991
01000 UnicodeString& getNegativePrefix(UnicodeString& result) const;
01001
01009 virtual void setNegativePrefix(const UnicodeString& newValue);
01010
01019 UnicodeString& getPositiveSuffix(UnicodeString& result) const;
01020
01028 virtual void setPositiveSuffix(const UnicodeString& newValue);
01029
01038 UnicodeString& getNegativeSuffix(UnicodeString& result) const;
01039
01047 virtual void setNegativeSuffix(const UnicodeString& newValue);
01048
01059 int32_t getMultiplier(void) const;
01060
01071 virtual void setMultiplier(int32_t newValue);
01072
01082 virtual double getRoundingIncrement(void) const;
01083
01094 virtual void setRoundingIncrement(double newValue);
01095
01104 virtual ERoundingMode getRoundingMode(void) const;
01105
01115 virtual void setRoundingMode(ERoundingMode roundingMode);
01116
01128 virtual int32_t getFormatWidth(void) const;
01129
01144 virtual void setFormatWidth(int32_t width);
01145
01158 virtual UnicodeString getPadCharacterString() const;
01159
01174 virtual void setPadCharacter(const UnicodeString &padChar);
01175
01191 virtual EPadPosition getPadPosition(void) const;
01192
01209 virtual void setPadPosition(EPadPosition padPos);
01210
01221 virtual UBool isScientificNotation(void);
01222
01238 virtual void setScientificNotation(UBool useScientific);
01239
01250 virtual int8_t getMinimumExponentDigits(void) const;
01251
01264 virtual void setMinimumExponentDigits(int8_t minExpDig);
01265
01278 virtual UBool isExponentSignAlwaysShown(void);
01279
01293 virtual void setExponentSignAlwaysShown(UBool expSignAlways);
01294
01306 int32_t getGroupingSize(void) const;
01307
01319 virtual void setGroupingSize(int32_t newValue);
01320
01339 int32_t getSecondaryGroupingSize(void) const;
01340
01352 virtual void setSecondaryGroupingSize(int32_t newValue);
01353
01362 UBool isDecimalSeparatorAlwaysShown(void) const;
01363
01372 virtual void setDecimalSeparatorAlwaysShown(UBool newValue);
01373
01384 virtual UnicodeString& toPattern(UnicodeString& result) const;
01385
01396 virtual UnicodeString& toLocalizedPattern(UnicodeString& result) const;
01397
01427 virtual void applyPattern(const UnicodeString& pattern,
01428 UParseError& parseError,
01429 UErrorCode& status);
01438 virtual void applyPattern(const UnicodeString& pattern,
01439 UErrorCode& status);
01440
01471 virtual void applyLocalizedPattern(const UnicodeString& pattern,
01472 UParseError& parseError,
01473 UErrorCode& status);
01474
01484 virtual void applyLocalizedPattern(const UnicodeString& pattern,
01485 UErrorCode& status);
01486
01487
01497 virtual void setMaximumIntegerDigits(int32_t newValue);
01498
01508 virtual void setMinimumIntegerDigits(int32_t newValue);
01509
01519 virtual void setMaximumFractionDigits(int32_t newValue);
01520
01530 virtual void setMinimumFractionDigits(int32_t newValue);
01531
01539 int32_t getMinimumSignificantDigits() const;
01540
01548 int32_t getMaximumSignificantDigits() const;
01549
01559 void setMinimumSignificantDigits(int32_t min);
01560
01571 void setMaximumSignificantDigits(int32_t max);
01572
01579 UBool areSignificantDigitsUsed() const;
01580
01588 void setSignificantDigitsUsed(UBool useSignificantDigits);
01589
01590 public:
01603 virtual void setCurrency(const UChar* theCurrency, UErrorCode& ec);
01604
01610 virtual void setCurrency(const UChar* theCurrency);
01611
01617 static const char fgNumberPatterns[];
01618
01619 public:
01620
01632 static UClassID U_EXPORT2 getStaticClassID(void);
01633
01645 virtual UClassID getDynamicClassID(void) const;
01646
01647 private:
01648 DecimalFormat();
01649
01650 int32_t precision(UBool isIntegral) const;
01651
01655 void construct(UErrorCode& status,
01656 UParseError& parseErr,
01657 const UnicodeString* pattern = 0,
01658 DecimalFormatSymbols* symbolsToAdopt = 0
01659 );
01660
01669 UnicodeString& toPattern(UnicodeString& result, UBool localized) const;
01670
01681 void applyPattern(const UnicodeString& pattern,
01682 UBool localized,
01683 UParseError& parseError,
01684 UErrorCode& status);
01696 UnicodeString& subformat(UnicodeString& appendTo,
01697 FieldPosition& fieldPosition,
01698 DigitList& digits,
01699 UBool isInteger) const;
01700
01701 void parse(const UnicodeString& text,
01702 Formattable& result,
01703 ParsePosition& pos,
01704 UBool parseCurrency) const;
01705
01706 enum {
01707 fgStatusInfinite,
01708 fgStatusLength
01709 } StatusFlags;
01710
01711 UBool subparse(const UnicodeString& text, ParsePosition& parsePosition,
01712 DigitList& digits, UBool* status,
01713 UChar* currency) const;
01714
01715 int32_t skipPadding(const UnicodeString& text, int32_t position) const;
01716
01717 int32_t compareAffix(const UnicodeString& input,
01718 int32_t pos,
01719 UBool isNegative,
01720 UBool isPrefix,
01721 UChar* currency) const;
01722
01723 static int32_t compareSimpleAffix(const UnicodeString& affix,
01724 const UnicodeString& input,
01725 int32_t pos);
01726
01727 static int32_t skipRuleWhiteSpace(const UnicodeString& text, int32_t pos);
01728
01729 static int32_t skipUWhiteSpace(const UnicodeString& text, int32_t pos);
01730
01731 int32_t compareComplexAffix(const UnicodeString& affixPat,
01732 const UnicodeString& input,
01733 int32_t pos,
01734 UChar* currency) const;
01735
01736 static int32_t match(const UnicodeString& text, int32_t pos, UChar32 ch);
01737
01738 static int32_t match(const UnicodeString& text, int32_t pos, const UnicodeString& str);
01739
01745 inline const UnicodeString &getConstSymbol(DecimalFormatSymbols::ENumberFormatSymbol symbol) const;
01746
01747 int32_t appendAffix(UnicodeString& buf, double number,
01748 UBool isNegative, UBool isPrefix) const;
01749
01755 void appendAffixPattern(UnicodeString& appendTo, const UnicodeString& affix,
01756 UBool localized) const;
01757
01758 void appendAffixPattern(UnicodeString& appendTo,
01759 const UnicodeString* affixPattern,
01760 const UnicodeString& expAffix, UBool localized) const;
01761
01762 void expandAffix(const UnicodeString& pattern,
01763 UnicodeString& affix,
01764 double number,
01765 UBool doFormat) const;
01766
01767 void expandAffixes();
01768
01769 static double round(double a, ERoundingMode mode, UBool isNegative);
01770
01771 void addPadding(UnicodeString& appendTo,
01772 FieldPosition& fieldPosition,
01773 int32_t prefixLen, int32_t suffixLen) const;
01774
01775 UBool isGroupingPosition(int32_t pos) const;
01776
01777 void setCurrencyForSymbols();
01778
01782
01783
01784
01785
01786 UnicodeString fPositivePrefix;
01787 UnicodeString fPositiveSuffix;
01788 UnicodeString fNegativePrefix;
01789 UnicodeString fNegativeSuffix;
01790 UnicodeString* fPosPrefixPattern;
01791 UnicodeString* fPosSuffixPattern;
01792 UnicodeString* fNegPrefixPattern;
01793 UnicodeString* fNegSuffixPattern;
01794
01800 ChoiceFormat* fCurrencyChoice;
01801
01802 int32_t fMultiplier;
01803 int32_t fGroupingSize;
01804 int32_t fGroupingSize2;
01805 UBool fDecimalSeparatorAlwaysShown;
01806 UBool fIsCurrencyFormat;
01807 DecimalFormatSymbols* fSymbols;
01808
01809 UBool fUseSignificantDigits;
01810 int32_t fMinSignificantDigits;
01811 int32_t fMaxSignificantDigits;
01812
01813 UBool fUseExponentialNotation;
01814 int8_t fMinExponentDigits;
01815 UBool fExponentSignAlwaysShown;
01816
01817
01818
01819
01820
01821 DigitList* fRoundingIncrement;
01822 double fRoundingDouble;
01823 ERoundingMode fRoundingMode;
01824
01825 UChar32 fPad;
01826 int32_t fFormatWidth;
01827 EPadPosition fPadPosition;
01828
01829 protected:
01830
01839 virtual void getEffectiveCurrency(UChar* result, UErrorCode& ec) const;
01840
01844 static const int32_t kDoubleIntegerDigits;
01848 static const int32_t kDoubleFractionDigits;
01849
01860 static const int32_t kMaxScientificIntegerDigits;
01861 };
01862
01863 inline UnicodeString&
01864 DecimalFormat::format(const Formattable& obj,
01865 UnicodeString& appendTo,
01866 UErrorCode& status) const {
01867
01868
01869 return NumberFormat::format(obj, appendTo, status);
01870 }
01871
01872 inline UnicodeString&
01873 DecimalFormat::format(double number,
01874 UnicodeString& appendTo) const {
01875 FieldPosition pos(0);
01876 return format(number, appendTo, pos);
01877 }
01878
01879 inline UnicodeString&
01880 DecimalFormat::format(int32_t number,
01881 UnicodeString& appendTo) const {
01882 FieldPosition pos(0);
01883 return format((int64_t)number, appendTo, pos);
01884 }
01885
01886 inline const UnicodeString &
01887 DecimalFormat::getConstSymbol(DecimalFormatSymbols::ENumberFormatSymbol symbol) const {
01888 return fSymbols->getConstSymbol(symbol);
01889 }
01890
01891 U_NAMESPACE_END
01892
01893 #endif
01894
01895 #endif // _DECIMFMT
01896