00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #ifndef DECIMFMT_H
00028 #define DECIMFMT_H
00029
00030 #include "unicode/utypes.h"
00036 #if !UCONFIG_NO_FORMATTING
00037
00038 #include "unicode/dcfmtsym.h"
00039 #include "unicode/numfmt.h"
00040 #include "unicode/locid.h"
00041 #include "unicode/fpositer.h"
00042 #include "unicode/stringpiece.h"
00043 #include "unicode/curramt.h"
00044 #include "unicode/enumset.h"
00045
00046 U_NAMESPACE_BEGIN
00047
00048 class CurrencyPluralInfo;
00049 class CompactDecimalFormat;
00050
00051 namespace number {
00052 class LocalizedNumberFormatter;
00053 class FormattedNumber;
00054 namespace impl {
00055 class DecimalQuantity;
00056 struct DecimalFormatFields;
00057 }
00058 }
00059
00060 namespace numparse {
00061 namespace impl {
00062 class NumberParserImpl;
00063 }
00064 }
00065
00071 #if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN && !defined(U_IN_DOXYGEN)
00072 template class U_I18N_API EnumSet<UNumberFormatAttribute,
00073 UNUM_MAX_NONBOOLEAN_ATTRIBUTE+1,
00074 UNUM_LIMIT_BOOLEAN_ATTRIBUTE>;
00075 #endif
00076
00677 class U_I18N_API DecimalFormat : public NumberFormat {
00678 public:
00683 enum EPadPosition {
00684 kPadBeforePrefix, kPadAfterPrefix, kPadBeforeSuffix, kPadAfterSuffix
00685 };
00686
00703 DecimalFormat(UErrorCode& status);
00704
00722 DecimalFormat(const UnicodeString& pattern, UErrorCode& status);
00723
00745 DecimalFormat(const UnicodeString& pattern, DecimalFormatSymbols* symbolsToAdopt, UErrorCode& status);
00746
00747 #ifndef U_HIDE_INTERNAL_API
00748
00761 DecimalFormat(const UnicodeString& pattern, DecimalFormatSymbols* symbolsToAdopt,
00762 UNumberFormatStyle style, UErrorCode& status);
00763
00764 #if UCONFIG_HAVE_PARSEALLINPUT
00765
00769 void setParseAllInput(UNumberFormatAttributeValue value);
00770
00771 #endif
00772
00773 #endif
00774
00775 private:
00776
00781 DecimalFormat(const DecimalFormatSymbols* symbolsToAdopt, UErrorCode& status);
00782
00783 public:
00784
00795 virtual DecimalFormat& setAttribute(UNumberFormatAttribute attr, int32_t newValue, UErrorCode& status);
00796
00806 virtual int32_t getAttribute(UNumberFormatAttribute attr, UErrorCode& status) const;
00807
00808
00815 void setGroupingUsed(UBool newValue) U_OVERRIDE;
00816
00824 void setParseIntegerOnly(UBool value) U_OVERRIDE;
00825
00833 void setLenient(UBool enable) U_OVERRIDE;
00834
00857 DecimalFormat(const UnicodeString& pattern, DecimalFormatSymbols* symbolsToAdopt,
00858 UParseError& parseError, UErrorCode& status);
00859
00880 DecimalFormat(const UnicodeString& pattern, const DecimalFormatSymbols& symbols, UErrorCode& status);
00881
00888 DecimalFormat(const DecimalFormat& source);
00889
00896 DecimalFormat& operator=(const DecimalFormat& rhs);
00897
00902 ~DecimalFormat() U_OVERRIDE;
00903
00911 Format* clone(void) const U_OVERRIDE;
00912
00921 UBool operator==(const Format& other) const U_OVERRIDE;
00922
00923
00924 using NumberFormat::format;
00925
00937 UnicodeString& format(double number, UnicodeString& appendTo, FieldPosition& pos) const U_OVERRIDE;
00938
00939 #ifndef U_HIDE_INTERNAL_API
00940
00952 UnicodeString& format(double number, UnicodeString& appendTo, FieldPosition& pos,
00953 UErrorCode& status) const U_OVERRIDE;
00954 #endif
00955
00969 UnicodeString& format(double number, UnicodeString& appendTo, FieldPositionIterator* posIter,
00970 UErrorCode& status) const U_OVERRIDE;
00971
00983 UnicodeString& format(int32_t number, UnicodeString& appendTo, FieldPosition& pos) const U_OVERRIDE;
00984
00985 #ifndef U_HIDE_INTERNAL_API
00986
00998 UnicodeString& format(int32_t number, UnicodeString& appendTo, FieldPosition& pos,
00999 UErrorCode& status) const U_OVERRIDE;
01000 #endif
01001
01015 UnicodeString& format(int32_t number, UnicodeString& appendTo, FieldPositionIterator* posIter,
01016 UErrorCode& status) const U_OVERRIDE;
01017
01029 UnicodeString& format(int64_t number, UnicodeString& appendTo, FieldPosition& pos) const U_OVERRIDE;
01030
01031 #ifndef U_HIDE_INTERNAL_API
01032
01044 UnicodeString& format(int64_t number, UnicodeString& appendTo, FieldPosition& pos,
01045 UErrorCode& status) const U_OVERRIDE;
01046 #endif
01047
01061 UnicodeString& format(int64_t number, UnicodeString& appendTo, FieldPositionIterator* posIter,
01062 UErrorCode& status) const U_OVERRIDE;
01063
01080 UnicodeString& format(StringPiece number, UnicodeString& appendTo, FieldPositionIterator* posIter,
01081 UErrorCode& status) const U_OVERRIDE;
01082
01083 #ifndef U_HIDE_INTERNAL_API
01084
01100 UnicodeString& format(const number::impl::DecimalQuantity& number, UnicodeString& appendTo,
01101 FieldPositionIterator* posIter, UErrorCode& status) const U_OVERRIDE;
01102
01118 UnicodeString& format(const number::impl::DecimalQuantity& number, UnicodeString& appendTo,
01119 FieldPosition& pos, UErrorCode& status) const U_OVERRIDE;
01120
01121 #endif // U_HIDE_INTERNAL_API
01122
01123 using NumberFormat::parse;
01124
01144 void parse(const UnicodeString& text, Formattable& result,
01145 ParsePosition& parsePosition) const U_OVERRIDE;
01146
01166 CurrencyAmount* parseCurrency(const UnicodeString& text, ParsePosition& pos) const U_OVERRIDE;
01167
01175 virtual const DecimalFormatSymbols* getDecimalFormatSymbols(void) const;
01176
01183 virtual void adoptDecimalFormatSymbols(DecimalFormatSymbols* symbolsToAdopt);
01184
01191 virtual void setDecimalFormatSymbols(const DecimalFormatSymbols& symbols);
01192
01193
01200 virtual const CurrencyPluralInfo* getCurrencyPluralInfo(void) const;
01201
01208 virtual void adoptCurrencyPluralInfo(CurrencyPluralInfo* toAdopt);
01209
01216 virtual void setCurrencyPluralInfo(const CurrencyPluralInfo& info);
01217
01218
01227 UnicodeString& getPositivePrefix(UnicodeString& result) const;
01228
01236 virtual void setPositivePrefix(const UnicodeString& newValue);
01237
01246 UnicodeString& getNegativePrefix(UnicodeString& result) const;
01247
01255 virtual void setNegativePrefix(const UnicodeString& newValue);
01256
01265 UnicodeString& getPositiveSuffix(UnicodeString& result) const;
01266
01274 virtual void setPositiveSuffix(const UnicodeString& newValue);
01275
01284 UnicodeString& getNegativeSuffix(UnicodeString& result) const;
01285
01293 virtual void setNegativeSuffix(const UnicodeString& newValue);
01294
01295 #ifndef U_HIDE_INTERNAL_API
01296
01300 UBool isSignAlwaysShown() const;
01301 #endif
01302
01308 virtual void setSignAlwaysShown(UBool value);
01309
01322 int32_t getMultiplier(void) const;
01323
01337 virtual void setMultiplier(int32_t newValue);
01338
01339 #ifndef U_HIDE_DRAFT_API
01340
01352 int32_t getMultiplierScale(void) const;
01353 #endif
01354
01374 virtual void setMultiplierScale(int32_t newValue);
01375
01385 virtual double getRoundingIncrement(void) const;
01386
01398 virtual void setRoundingIncrement(double newValue);
01399
01408 virtual ERoundingMode getRoundingMode(void) const U_OVERRIDE;
01409
01418 virtual void setRoundingMode(ERoundingMode roundingMode) U_OVERRIDE;
01419
01431 virtual int32_t getFormatWidth(void) const;
01432
01447 virtual void setFormatWidth(int32_t width);
01448
01461 virtual UnicodeString getPadCharacterString() const;
01462
01477 virtual void setPadCharacter(const UnicodeString& padChar);
01478
01494 virtual EPadPosition getPadPosition(void) const;
01495
01512 virtual void setPadPosition(EPadPosition padPos);
01513
01524 virtual UBool isScientificNotation(void) const;
01525
01541 virtual void setScientificNotation(UBool useScientific);
01542
01553 virtual int8_t getMinimumExponentDigits(void) const;
01554
01567 virtual void setMinimumExponentDigits(int8_t minExpDig);
01568
01581 virtual UBool isExponentSignAlwaysShown(void) const;
01582
01596 virtual void setExponentSignAlwaysShown(UBool expSignAlways);
01597
01609 int32_t getGroupingSize(void) const;
01610
01622 virtual void setGroupingSize(int32_t newValue);
01623
01642 int32_t getSecondaryGroupingSize(void) const;
01643
01655 virtual void setSecondaryGroupingSize(int32_t newValue);
01656
01657 #ifndef U_HIDE_INTERNAL_API
01658
01680 int32_t getMinimumGroupingDigits() const;
01681
01682 #endif
01683
01684
01693 virtual void setMinimumGroupingDigits(int32_t newValue);
01694
01695
01704 UBool isDecimalSeparatorAlwaysShown(void) const;
01705
01714 virtual void setDecimalSeparatorAlwaysShown(UBool newValue);
01715
01722 UBool isDecimalPatternMatchRequired(void) const;
01723
01733 virtual void setDecimalPatternMatchRequired(UBool newValue);
01734
01741 virtual UBool isParseNoExponent() const;
01742
01751 virtual void setParseNoExponent(UBool value);
01752
01759 virtual UBool isParseCaseSensitive() const;
01760
01770 virtual void setParseCaseSensitive(UBool value);
01771
01779 virtual UBool isFormatFailIfMoreThanMaxDigits() const;
01780
01787 virtual void setFormatFailIfMoreThanMaxDigits(UBool value);
01788
01789
01800 virtual UnicodeString& toPattern(UnicodeString& result) const;
01801
01812 virtual UnicodeString& toLocalizedPattern(UnicodeString& result) const;
01813
01843 virtual void applyPattern(const UnicodeString& pattern, UParseError& parseError, UErrorCode& status);
01844
01853 virtual void applyPattern(const UnicodeString& pattern, UErrorCode& status);
01854
01885 virtual void applyLocalizedPattern(const UnicodeString& pattern, UParseError& parseError,
01886 UErrorCode& status);
01887
01897 virtual void applyLocalizedPattern(const UnicodeString& pattern, UErrorCode& status);
01898
01899
01909 void setMaximumIntegerDigits(int32_t newValue) U_OVERRIDE;
01910
01920 void setMinimumIntegerDigits(int32_t newValue) U_OVERRIDE;
01921
01931 void setMaximumFractionDigits(int32_t newValue) U_OVERRIDE;
01932
01942 void setMinimumFractionDigits(int32_t newValue) U_OVERRIDE;
01943
01951 int32_t getMinimumSignificantDigits() const;
01952
01960 int32_t getMaximumSignificantDigits() const;
01961
01973 void setMinimumSignificantDigits(int32_t min);
01974
01986 void setMaximumSignificantDigits(int32_t max);
01987
01994 UBool areSignificantDigitsUsed() const;
01995
02003 void setSignificantDigitsUsed(UBool useSignificantDigits);
02004
02017 void setCurrency(const char16_t* theCurrency, UErrorCode& ec) U_OVERRIDE;
02018
02024 virtual void setCurrency(const char16_t* theCurrency);
02025
02034 void setCurrencyUsage(UCurrencyUsage newUsage, UErrorCode* ec);
02035
02040 UCurrencyUsage getCurrencyUsage() const;
02041
02042 #ifndef U_HIDE_INTERNAL_API
02043
02049 void formatToDecimalQuantity(double number, number::impl::DecimalQuantity& output,
02050 UErrorCode& status) const;
02051
02058 void formatToDecimalQuantity(const Formattable& number, number::impl::DecimalQuantity& output,
02059 UErrorCode& status) const;
02060
02061 #endif
02062
02063 #ifndef U_HIDE_DRAFT_API
02064
02086 const number::LocalizedNumberFormatter& toNumberFormatter() const;
02087 #endif
02088
02100 static UClassID U_EXPORT2 getStaticClassID(void);
02101
02113 UClassID getDynamicClassID(void) const U_OVERRIDE;
02114
02115 private:
02116
02118 void touch(UErrorCode& status);
02119
02121 void touchNoError();
02122
02134 void setPropertiesFromPattern(const UnicodeString& pattern, int32_t ignoreRounding,
02135 UErrorCode& status);
02136
02137 const numparse::impl::NumberParserImpl* getParser(UErrorCode& status) const;
02138
02139 const numparse::impl::NumberParserImpl* getCurrencyParser(UErrorCode& status) const;
02140
02141 static void fieldPositionHelper(const number::FormattedNumber& formatted, FieldPosition& fieldPosition,
02142 int32_t offset, UErrorCode& status);
02143
02144 static void fieldPositionIteratorHelper(const number::FormattedNumber& formatted,
02145 FieldPositionIterator* fpi, int32_t offset, UErrorCode& status);
02146
02147 void setupFastFormat();
02148
02149 bool fastFormatDouble(double input, UnicodeString& output) const;
02150
02151 bool fastFormatInt64(int64_t input, UnicodeString& output) const;
02152
02153 void doFastFormatInt32(int32_t input, bool isNegative, UnicodeString& output) const;
02154
02155
02156
02157
02158
02159
02160 number::impl::DecimalFormatFields* fields;
02161
02162
02163 friend class CompactDecimalFormat;
02164
02165 };
02166
02167 U_NAMESPACE_END
02168
02169 #endif
02170
02171 #endif // _DECIMFMT
02172