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"
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
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
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 U_EXPORT2 getStaticClassID(void);
01635
01647 virtual UClassID getDynamicClassID(void) const;
01648
01649 private:
01650 DecimalFormat();
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
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
01787
01788
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 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
01822
01823
01824
01825 DigitList* fRoundingIncrement;
01826 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
01872
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
01898
01899 #endif // _DECIMFMT
01900