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 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
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
01686 void setMinimumGroupingDigits(int32_t newValue);
01687
01696 UBool isDecimalSeparatorAlwaysShown(void) const;
01697
01706 virtual void setDecimalSeparatorAlwaysShown(UBool newValue);
01707
01714 UBool isDecimalPatternMatchRequired(void) const;
01715
01725 virtual void setDecimalPatternMatchRequired(UBool newValue);
01726
01734 UBool isParseNoExponent() const;
01735
01744 void setParseNoExponent(UBool value);
01745
01753 UBool isParseCaseSensitive() const;
01754
01766 void setParseCaseSensitive(UBool value);
01767
01776 UBool isFormatFailIfMoreThanMaxDigits() const;
01777
01785 void setFormatFailIfMoreThanMaxDigits(UBool value);
01786
01797 virtual UnicodeString& toPattern(UnicodeString& result) const;
01798
01809 virtual UnicodeString& toLocalizedPattern(UnicodeString& result) const;
01810
01840 virtual void applyPattern(const UnicodeString& pattern, UParseError& parseError, UErrorCode& status);
01841
01850 virtual void applyPattern(const UnicodeString& pattern, UErrorCode& status);
01851
01882 virtual void applyLocalizedPattern(const UnicodeString& pattern, UParseError& parseError,
01883 UErrorCode& status);
01884
01894 virtual void applyLocalizedPattern(const UnicodeString& pattern, UErrorCode& status);
01895
01896
01906 void setMaximumIntegerDigits(int32_t newValue) U_OVERRIDE;
01907
01917 void setMinimumIntegerDigits(int32_t newValue) U_OVERRIDE;
01918
01928 void setMaximumFractionDigits(int32_t newValue) U_OVERRIDE;
01929
01939 void setMinimumFractionDigits(int32_t newValue) U_OVERRIDE;
01940
01948 int32_t getMinimumSignificantDigits() const;
01949
01957 int32_t getMaximumSignificantDigits() const;
01958
01970 void setMinimumSignificantDigits(int32_t min);
01971
01983 void setMaximumSignificantDigits(int32_t max);
01984
01991 UBool areSignificantDigitsUsed() const;
01992
02000 void setSignificantDigitsUsed(UBool useSignificantDigits);
02001
02014 void setCurrency(const char16_t* theCurrency, UErrorCode& ec) U_OVERRIDE;
02015
02016 #ifndef U_FORCE_HIDE_DEPRECATED_API
02017
02022 virtual void setCurrency(const char16_t* theCurrency);
02023 #endif // U_FORCE_HIDE_DEPRECATED_API
02024
02033 void setCurrencyUsage(UCurrencyUsage newUsage, UErrorCode* ec);
02034
02039 UCurrencyUsage getCurrencyUsage() const;
02040
02041 #ifndef U_HIDE_INTERNAL_API
02042
02048 void formatToDecimalQuantity(double number, number::impl::DecimalQuantity& output,
02049 UErrorCode& status) const;
02050
02057 void formatToDecimalQuantity(const Formattable& number, number::impl::DecimalQuantity& output,
02058 UErrorCode& status) const;
02059
02060 #endif
02061
02107 const number::LocalizedNumberFormatter* toNumberFormatter(UErrorCode& status) const;
02108
02120 static UClassID U_EXPORT2 getStaticClassID(void);
02121
02133 UClassID getDynamicClassID(void) const U_OVERRIDE;
02134
02135 private:
02136
02138 void touch(UErrorCode& status);
02139
02141 void touchNoError();
02142
02154 void setPropertiesFromPattern(const UnicodeString& pattern, int32_t ignoreRounding,
02155 UErrorCode& status);
02156
02157 const numparse::impl::NumberParserImpl* getParser(UErrorCode& status) const;
02158
02159 const numparse::impl::NumberParserImpl* getCurrencyParser(UErrorCode& status) const;
02160
02161 static void fieldPositionHelper(
02162 const number::impl::UFormattedNumberData& formatted,
02163 FieldPosition& fieldPosition,
02164 int32_t offset,
02165 UErrorCode& status);
02166
02167 static void fieldPositionIteratorHelper(
02168 const number::impl::UFormattedNumberData& formatted,
02169 FieldPositionIterator* fpi,
02170 int32_t offset,
02171 UErrorCode& status);
02172
02173 void setupFastFormat();
02174
02175 bool fastFormatDouble(double input, UnicodeString& output) const;
02176
02177 bool fastFormatInt64(int64_t input, UnicodeString& output) const;
02178
02179 void doFastFormatInt32(int32_t input, bool isNegative, UnicodeString& output) const;
02180
02181
02182
02183
02184
02185
02186
02187
02188 number::impl::DecimalFormatFields* fields = nullptr;
02189
02190
02191 friend class CompactDecimalFormat;
02192
02193
02194 friend class MeasureFormat;
02195
02196 };
02197
02198 U_NAMESPACE_END
02199
02200 #endif
02201
02202 #endif
02203
02204 #endif // _DECIMFMT
02205