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"
00031
00032 #if U_SHOW_CPLUSPLUS_API
00033
00039 #if !UCONFIG_NO_FORMATTING
00040
00041 #include "unicode/dcfmtsym.h"
00042 #include "unicode/numfmt.h"
00043 #include "unicode/locid.h"
00044 #include "unicode/fpositer.h"
00045 #include "unicode/stringpiece.h"
00046 #include "unicode/curramt.h"
00047 #include "unicode/enumset.h"
00048
00049 U_NAMESPACE_BEGIN
00050
00051 class CurrencyPluralInfo;
00052 class CompactDecimalFormat;
00053
00054 namespace number {
00055 class LocalizedNumberFormatter;
00056 namespace impl {
00057 class DecimalQuantity;
00058 struct DecimalFormatFields;
00059 class UFormattedNumberData;
00060 }
00061 }
00062
00063 namespace numparse {
00064 namespace impl {
00065 class NumberParserImpl;
00066 }
00067 }
00068
00668 class U_I18N_API DecimalFormat : public NumberFormat {
00669 public:
00674 enum EPadPosition {
00675 kPadBeforePrefix, kPadAfterPrefix, kPadBeforeSuffix, kPadAfterSuffix
00676 };
00677
00694 DecimalFormat(UErrorCode& status);
00695
00713 DecimalFormat(const UnicodeString& pattern, UErrorCode& status);
00714
00736 DecimalFormat(const UnicodeString& pattern, DecimalFormatSymbols* symbolsToAdopt, UErrorCode& status);
00737
00738 #ifndef U_HIDE_INTERNAL_API
00739
00752 DecimalFormat(const UnicodeString& pattern, DecimalFormatSymbols* symbolsToAdopt,
00753 UNumberFormatStyle style, UErrorCode& status);
00754
00755 #if UCONFIG_HAVE_PARSEALLINPUT
00756
00760 void setParseAllInput(UNumberFormatAttributeValue value);
00761
00762 #endif
00763
00764 #endif
00765
00766 private:
00767
00772 DecimalFormat(const DecimalFormatSymbols* symbolsToAdopt, UErrorCode& status);
00773
00774 public:
00775
00786 virtual DecimalFormat& setAttribute(UNumberFormatAttribute attr, int32_t newValue, UErrorCode& status);
00787
00797 virtual int32_t getAttribute(UNumberFormatAttribute attr, UErrorCode& status) const;
00798
00799
00806 void setGroupingUsed(UBool newValue) U_OVERRIDE;
00807
00815 void setParseIntegerOnly(UBool value) U_OVERRIDE;
00816
00824 void setLenient(UBool enable) U_OVERRIDE;
00825
00848 DecimalFormat(const UnicodeString& pattern, DecimalFormatSymbols* symbolsToAdopt,
00849 UParseError& parseError, UErrorCode& status);
00850
00871 DecimalFormat(const UnicodeString& pattern, const DecimalFormatSymbols& symbols, UErrorCode& status);
00872
00879 DecimalFormat(const DecimalFormat& source);
00880
00887 DecimalFormat& operator=(const DecimalFormat& rhs);
00888
00893 ~DecimalFormat() U_OVERRIDE;
00894
00902 DecimalFormat* clone() const U_OVERRIDE;
00903
00912 bool operator==(const Format& other) const U_OVERRIDE;
00913
00914
00915 using NumberFormat::format;
00916
00928 UnicodeString& format(double number, UnicodeString& appendTo, FieldPosition& pos) const U_OVERRIDE;
00929
00930 #ifndef U_HIDE_INTERNAL_API
00931
00943 UnicodeString& format(double number, UnicodeString& appendTo, FieldPosition& pos,
00944 UErrorCode& status) const U_OVERRIDE;
00945 #endif
00946
00960 UnicodeString& format(double number, UnicodeString& appendTo, FieldPositionIterator* posIter,
00961 UErrorCode& status) const U_OVERRIDE;
00962
00974 UnicodeString& format(int32_t number, UnicodeString& appendTo, FieldPosition& pos) const U_OVERRIDE;
00975
00976 #ifndef U_HIDE_INTERNAL_API
00977
00989 UnicodeString& format(int32_t number, UnicodeString& appendTo, FieldPosition& pos,
00990 UErrorCode& status) const U_OVERRIDE;
00991 #endif
00992
01006 UnicodeString& format(int32_t number, UnicodeString& appendTo, FieldPositionIterator* posIter,
01007 UErrorCode& status) const U_OVERRIDE;
01008
01020 UnicodeString& format(int64_t number, UnicodeString& appendTo, FieldPosition& pos) const U_OVERRIDE;
01021
01022 #ifndef U_HIDE_INTERNAL_API
01023
01035 UnicodeString& format(int64_t number, UnicodeString& appendTo, FieldPosition& pos,
01036 UErrorCode& status) const U_OVERRIDE;
01037 #endif
01038
01052 UnicodeString& format(int64_t number, UnicodeString& appendTo, FieldPositionIterator* posIter,
01053 UErrorCode& status) const U_OVERRIDE;
01054
01071 UnicodeString& format(StringPiece number, UnicodeString& appendTo, FieldPositionIterator* posIter,
01072 UErrorCode& status) const U_OVERRIDE;
01073
01074 #ifndef U_HIDE_INTERNAL_API
01075
01091 UnicodeString& format(const number::impl::DecimalQuantity& number, UnicodeString& appendTo,
01092 FieldPositionIterator* posIter, UErrorCode& status) const U_OVERRIDE;
01093
01109 UnicodeString& format(const number::impl::DecimalQuantity& number, UnicodeString& appendTo,
01110 FieldPosition& pos, UErrorCode& status) const U_OVERRIDE;
01111
01112 #endif // U_HIDE_INTERNAL_API
01113
01114 using NumberFormat::parse;
01115
01135 void parse(const UnicodeString& text, Formattable& result,
01136 ParsePosition& parsePosition) const U_OVERRIDE;
01137
01157 CurrencyAmount* parseCurrency(const UnicodeString& text, ParsePosition& pos) const U_OVERRIDE;
01158
01166 virtual const DecimalFormatSymbols* getDecimalFormatSymbols(void) const;
01167
01174 virtual void adoptDecimalFormatSymbols(DecimalFormatSymbols* symbolsToAdopt);
01175
01182 virtual void setDecimalFormatSymbols(const DecimalFormatSymbols& symbols);
01183
01184
01191 virtual const CurrencyPluralInfo* getCurrencyPluralInfo(void) const;
01192
01199 virtual void adoptCurrencyPluralInfo(CurrencyPluralInfo* toAdopt);
01200
01207 virtual void setCurrencyPluralInfo(const CurrencyPluralInfo& info);
01208
01209
01218 UnicodeString& getPositivePrefix(UnicodeString& result) const;
01219
01227 virtual void setPositivePrefix(const UnicodeString& newValue);
01228
01237 UnicodeString& getNegativePrefix(UnicodeString& result) const;
01238
01246 virtual void setNegativePrefix(const UnicodeString& newValue);
01247
01256 UnicodeString& getPositiveSuffix(UnicodeString& result) const;
01257
01265 virtual void setPositiveSuffix(const UnicodeString& newValue);
01266
01275 UnicodeString& getNegativeSuffix(UnicodeString& result) const;
01276
01284 virtual void setNegativeSuffix(const UnicodeString& newValue);
01285
01294 UBool isSignAlwaysShown() const;
01295
01304 void setSignAlwaysShown(UBool value);
01305
01318 int32_t getMultiplier(void) const;
01319
01333 virtual void setMultiplier(int32_t newValue);
01334
01347 int32_t getMultiplierScale(void) const;
01348
01368 void setMultiplierScale(int32_t newValue);
01369
01379 virtual double getRoundingIncrement(void) const;
01380
01392 virtual void setRoundingIncrement(double newValue);
01393
01402 virtual ERoundingMode getRoundingMode(void) const U_OVERRIDE;
01403
01412 virtual void setRoundingMode(ERoundingMode roundingMode) U_OVERRIDE;
01413
01425 virtual int32_t getFormatWidth(void) const;
01426
01441 virtual void setFormatWidth(int32_t width);
01442
01455 virtual UnicodeString getPadCharacterString() const;
01456
01471 virtual void setPadCharacter(const UnicodeString& padChar);
01472
01488 virtual EPadPosition getPadPosition(void) const;
01489
01506 virtual void setPadPosition(EPadPosition padPos);
01507
01518 virtual UBool isScientificNotation(void) const;
01519
01535 virtual void setScientificNotation(UBool useScientific);
01536
01547 virtual int8_t getMinimumExponentDigits(void) const;
01548
01561 virtual void setMinimumExponentDigits(int8_t minExpDig);
01562
01575 virtual UBool isExponentSignAlwaysShown(void) const;
01576
01590 virtual void setExponentSignAlwaysShown(UBool expSignAlways);
01591
01603 int32_t getGroupingSize(void) const;
01604
01616 virtual void setGroupingSize(int32_t newValue);
01617
01636 int32_t getSecondaryGroupingSize(void) const;
01637
01649 virtual void setSecondaryGroupingSize(int32_t newValue);
01650
01674 int32_t getMinimumGroupingDigits() const;
01675
01693 void setMinimumGroupingDigits(int32_t newValue);
01694
01703 UBool isDecimalSeparatorAlwaysShown(void) const;
01704
01713 virtual void setDecimalSeparatorAlwaysShown(UBool newValue);
01714
01721 UBool isDecimalPatternMatchRequired(void) const;
01722
01732 virtual void setDecimalPatternMatchRequired(UBool newValue);
01733
01741 UBool isParseNoExponent() const;
01742
01751 void setParseNoExponent(UBool value);
01752
01760 UBool isParseCaseSensitive() const;
01761
01773 void setParseCaseSensitive(UBool value);
01774
01783 UBool isFormatFailIfMoreThanMaxDigits() const;
01784
01792 void setFormatFailIfMoreThanMaxDigits(UBool value);
01793
01804 virtual UnicodeString& toPattern(UnicodeString& result) const;
01805
01816 virtual UnicodeString& toLocalizedPattern(UnicodeString& result) const;
01817
01847 virtual void applyPattern(const UnicodeString& pattern, UParseError& parseError, UErrorCode& status);
01848
01857 virtual void applyPattern(const UnicodeString& pattern, UErrorCode& status);
01858
01889 virtual void applyLocalizedPattern(const UnicodeString& pattern, UParseError& parseError,
01890 UErrorCode& status);
01891
01901 virtual void applyLocalizedPattern(const UnicodeString& pattern, UErrorCode& status);
01902
01903
01913 void setMaximumIntegerDigits(int32_t newValue) U_OVERRIDE;
01914
01924 void setMinimumIntegerDigits(int32_t newValue) U_OVERRIDE;
01925
01935 void setMaximumFractionDigits(int32_t newValue) U_OVERRIDE;
01936
01946 void setMinimumFractionDigits(int32_t newValue) U_OVERRIDE;
01947
01955 int32_t getMinimumSignificantDigits() const;
01956
01964 int32_t getMaximumSignificantDigits() const;
01965
01977 void setMinimumSignificantDigits(int32_t min);
01978
01990 void setMaximumSignificantDigits(int32_t max);
01991
01998 UBool areSignificantDigitsUsed() const;
01999
02007 void setSignificantDigitsUsed(UBool useSignificantDigits);
02008
02021 void setCurrency(const char16_t* theCurrency, UErrorCode& ec) U_OVERRIDE;
02022
02023 #ifndef U_FORCE_HIDE_DEPRECATED_API
02024
02029 virtual void setCurrency(const char16_t* theCurrency);
02030 #endif // U_FORCE_HIDE_DEPRECATED_API
02031
02040 void setCurrencyUsage(UCurrencyUsage newUsage, UErrorCode* ec);
02041
02046 UCurrencyUsage getCurrencyUsage() const;
02047
02048 #ifndef U_HIDE_INTERNAL_API
02049
02055 void formatToDecimalQuantity(double number, number::impl::DecimalQuantity& output,
02056 UErrorCode& status) const;
02057
02064 void formatToDecimalQuantity(const Formattable& number, number::impl::DecimalQuantity& output,
02065 UErrorCode& status) const;
02066
02067 #endif
02068
02114 const number::LocalizedNumberFormatter* toNumberFormatter(UErrorCode& status) const;
02115
02127 static UClassID U_EXPORT2 getStaticClassID(void);
02128
02140 UClassID getDynamicClassID(void) const U_OVERRIDE;
02141
02142 private:
02143
02145 void touch(UErrorCode& status);
02146
02148 void touchNoError();
02149
02161 void setPropertiesFromPattern(const UnicodeString& pattern, int32_t ignoreRounding,
02162 UErrorCode& status);
02163
02164 const numparse::impl::NumberParserImpl* getParser(UErrorCode& status) const;
02165
02166 const numparse::impl::NumberParserImpl* getCurrencyParser(UErrorCode& status) const;
02167
02168 static void fieldPositionHelper(
02169 const number::impl::UFormattedNumberData& formatted,
02170 FieldPosition& fieldPosition,
02171 int32_t offset,
02172 UErrorCode& status);
02173
02174 static void fieldPositionIteratorHelper(
02175 const number::impl::UFormattedNumberData& formatted,
02176 FieldPositionIterator* fpi,
02177 int32_t offset,
02178 UErrorCode& status);
02179
02180 void setupFastFormat();
02181
02182 bool fastFormatDouble(double input, UnicodeString& output) const;
02183
02184 bool fastFormatInt64(int64_t input, UnicodeString& output) const;
02185
02186 void doFastFormatInt32(int32_t input, bool isNegative, UnicodeString& output) const;
02187
02188
02189
02190
02191
02192
02193
02194
02195 number::impl::DecimalFormatFields* fields = nullptr;
02196
02197
02198 friend class CompactDecimalFormat;
02199
02200
02201 friend class MeasureFormat;
02202
02203 };
02204
02205 U_NAMESPACE_END
02206
02207 #endif
02208
02209 #endif
02210
02211 #endif // _DECIMFMT
02212