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 class FormattedNumber;
00057 namespace impl {
00058 class DecimalQuantity;
00059 struct DecimalFormatFields;
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 UBool 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
01286 #ifndef U_HIDE_DRAFT_API
01287
01295 UBool isSignAlwaysShown() const;
01296
01305 void setSignAlwaysShown(UBool value);
01306 #endif
01307
01320 int32_t getMultiplier(void) const;
01321
01335 virtual void setMultiplier(int32_t newValue);
01336
01349 int32_t getMultiplierScale(void) const;
01350
01370 void setMultiplierScale(int32_t newValue);
01371
01381 virtual double getRoundingIncrement(void) const;
01382
01394 virtual void setRoundingIncrement(double newValue);
01395
01404 virtual ERoundingMode getRoundingMode(void) const U_OVERRIDE;
01405
01414 virtual void setRoundingMode(ERoundingMode roundingMode) U_OVERRIDE;
01415
01427 virtual int32_t getFormatWidth(void) const;
01428
01443 virtual void setFormatWidth(int32_t width);
01444
01457 virtual UnicodeString getPadCharacterString() const;
01458
01473 virtual void setPadCharacter(const UnicodeString& padChar);
01474
01490 virtual EPadPosition getPadPosition(void) const;
01491
01508 virtual void setPadPosition(EPadPosition padPos);
01509
01520 virtual UBool isScientificNotation(void) const;
01521
01537 virtual void setScientificNotation(UBool useScientific);
01538
01549 virtual int8_t getMinimumExponentDigits(void) const;
01550
01563 virtual void setMinimumExponentDigits(int8_t minExpDig);
01564
01577 virtual UBool isExponentSignAlwaysShown(void) const;
01578
01592 virtual void setExponentSignAlwaysShown(UBool expSignAlways);
01593
01605 int32_t getGroupingSize(void) const;
01606
01618 virtual void setGroupingSize(int32_t newValue);
01619
01638 int32_t getSecondaryGroupingSize(void) const;
01639
01651 virtual void setSecondaryGroupingSize(int32_t newValue);
01652
01653 #ifndef U_HIDE_DRAFT_API
01654
01677 int32_t getMinimumGroupingDigits() const;
01678
01689 void setMinimumGroupingDigits(int32_t newValue);
01690 #endif
01691
01692
01701 UBool isDecimalSeparatorAlwaysShown(void) const;
01702
01711 virtual void setDecimalSeparatorAlwaysShown(UBool newValue);
01712
01719 UBool isDecimalPatternMatchRequired(void) const;
01720
01730 virtual void setDecimalPatternMatchRequired(UBool newValue);
01731
01732 #ifndef U_HIDE_DRAFT_API
01733
01740 UBool isParseNoExponent() const;
01741
01750 void setParseNoExponent(UBool value);
01751
01759 UBool isParseCaseSensitive() const;
01760
01772 void setParseCaseSensitive(UBool value);
01773
01782 UBool isFormatFailIfMoreThanMaxDigits() const;
01783
01791 void setFormatFailIfMoreThanMaxDigits(UBool value);
01792 #endif
01793
01794
01805 virtual UnicodeString& toPattern(UnicodeString& result) const;
01806
01817 virtual UnicodeString& toLocalizedPattern(UnicodeString& result) const;
01818
01848 virtual void applyPattern(const UnicodeString& pattern, UParseError& parseError, UErrorCode& status);
01849
01858 virtual void applyPattern(const UnicodeString& pattern, UErrorCode& status);
01859
01890 virtual void applyLocalizedPattern(const UnicodeString& pattern, UParseError& parseError,
01891 UErrorCode& status);
01892
01902 virtual void applyLocalizedPattern(const UnicodeString& pattern, UErrorCode& status);
01903
01904
01914 void setMaximumIntegerDigits(int32_t newValue) U_OVERRIDE;
01915
01925 void setMinimumIntegerDigits(int32_t newValue) U_OVERRIDE;
01926
01936 void setMaximumFractionDigits(int32_t newValue) U_OVERRIDE;
01937
01947 void setMinimumFractionDigits(int32_t newValue) U_OVERRIDE;
01948
01956 int32_t getMinimumSignificantDigits() const;
01957
01965 int32_t getMaximumSignificantDigits() const;
01966
01978 void setMinimumSignificantDigits(int32_t min);
01979
01991 void setMaximumSignificantDigits(int32_t max);
01992
01999 UBool areSignificantDigitsUsed() const;
02000
02008 void setSignificantDigitsUsed(UBool useSignificantDigits);
02009
02022 void setCurrency(const char16_t* theCurrency, UErrorCode& ec) U_OVERRIDE;
02023
02024 #ifndef U_FORCE_HIDE_DEPRECATED_API
02025
02030 virtual void setCurrency(const char16_t* theCurrency);
02031 #endif // U_FORCE_HIDE_DEPRECATED_API
02032
02041 void setCurrencyUsage(UCurrencyUsage newUsage, UErrorCode* ec);
02042
02047 UCurrencyUsage getCurrencyUsage() const;
02048
02049 #ifndef U_HIDE_INTERNAL_API
02050
02056 void formatToDecimalQuantity(double number, number::impl::DecimalQuantity& output,
02057 UErrorCode& status) const;
02058
02065 void formatToDecimalQuantity(const Formattable& number, number::impl::DecimalQuantity& output,
02066 UErrorCode& status) const;
02067
02068 #endif
02069
02070 #ifndef U_HIDE_DRAFT_API
02071
02116 const number::LocalizedNumberFormatter* toNumberFormatter(UErrorCode& status) const;
02117 #endif
02118
02130 static UClassID U_EXPORT2 getStaticClassID(void);
02131
02143 UClassID getDynamicClassID(void) const U_OVERRIDE;
02144
02145 private:
02146
02148 void touch(UErrorCode& status);
02149
02151 void touchNoError();
02152
02164 void setPropertiesFromPattern(const UnicodeString& pattern, int32_t ignoreRounding,
02165 UErrorCode& status);
02166
02167 const numparse::impl::NumberParserImpl* getParser(UErrorCode& status) const;
02168
02169 const numparse::impl::NumberParserImpl* getCurrencyParser(UErrorCode& status) const;
02170
02171 static void fieldPositionHelper(const number::FormattedNumber& formatted, FieldPosition& fieldPosition,
02172 int32_t offset, UErrorCode& status);
02173
02174 static void fieldPositionIteratorHelper(const number::FormattedNumber& formatted,
02175 FieldPositionIterator* fpi, int32_t offset, UErrorCode& status);
02176
02177 void setupFastFormat();
02178
02179 bool fastFormatDouble(double input, UnicodeString& output) const;
02180
02181 bool fastFormatInt64(int64_t input, UnicodeString& output) const;
02182
02183 void doFastFormatInt32(int32_t input, bool isNegative, UnicodeString& output) const;
02184
02185
02186
02187
02188
02189
02190
02191
02192 number::impl::DecimalFormatFields* fields = nullptr;
02193
02194
02195 friend class CompactDecimalFormat;
02196
02197
02198 friend class MeasureFormat;
02199
02200 };
02201
02202 U_NAMESPACE_END
02203
02204 #endif
02205
02206 #endif
02207
02208 #endif // _DECIMFMT
02209