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
00665 class U_I18N_API DecimalFormat : public NumberFormat {
00666 public:
00671 enum EPadPosition {
00672 kPadBeforePrefix, kPadAfterPrefix, kPadBeforeSuffix, kPadAfterSuffix
00673 };
00674
00691 DecimalFormat(UErrorCode& status);
00692
00710 DecimalFormat(const UnicodeString& pattern, UErrorCode& status);
00711
00733 DecimalFormat(const UnicodeString& pattern, DecimalFormatSymbols* symbolsToAdopt, UErrorCode& status);
00734
00735 #ifndef U_HIDE_INTERNAL_API
00736
00749 DecimalFormat(const UnicodeString& pattern, DecimalFormatSymbols* symbolsToAdopt,
00750 UNumberFormatStyle style, UErrorCode& status);
00751
00752 #if UCONFIG_HAVE_PARSEALLINPUT
00753
00757 void setParseAllInput(UNumberFormatAttributeValue value);
00758
00759 #endif
00760
00761 #endif
00762
00763 private:
00764
00769 DecimalFormat(const DecimalFormatSymbols* symbolsToAdopt, UErrorCode& status);
00770
00771 public:
00772
00783 virtual DecimalFormat& setAttribute(UNumberFormatAttribute attr, int32_t newValue, UErrorCode& status);
00784
00794 virtual int32_t getAttribute(UNumberFormatAttribute attr, UErrorCode& status) const;
00795
00796
00803 void setGroupingUsed(UBool newValue) U_OVERRIDE;
00804
00812 void setParseIntegerOnly(UBool value) U_OVERRIDE;
00813
00821 void setLenient(UBool enable) U_OVERRIDE;
00822
00845 DecimalFormat(const UnicodeString& pattern, DecimalFormatSymbols* symbolsToAdopt,
00846 UParseError& parseError, UErrorCode& status);
00847
00868 DecimalFormat(const UnicodeString& pattern, const DecimalFormatSymbols& symbols, UErrorCode& status);
00869
00876 DecimalFormat(const DecimalFormat& source);
00877
00884 DecimalFormat& operator=(const DecimalFormat& rhs);
00885
00890 ~DecimalFormat() U_OVERRIDE;
00891
00899 Format* clone(void) const U_OVERRIDE;
00900
00909 UBool operator==(const Format& other) const U_OVERRIDE;
00910
00911
00912 using NumberFormat::format;
00913
00925 UnicodeString& format(double number, UnicodeString& appendTo, FieldPosition& pos) const U_OVERRIDE;
00926
00927 #ifndef U_HIDE_INTERNAL_API
00928
00940 UnicodeString& format(double number, UnicodeString& appendTo, FieldPosition& pos,
00941 UErrorCode& status) const U_OVERRIDE;
00942 #endif
00943
00957 UnicodeString& format(double number, UnicodeString& appendTo, FieldPositionIterator* posIter,
00958 UErrorCode& status) const U_OVERRIDE;
00959
00971 UnicodeString& format(int32_t number, UnicodeString& appendTo, FieldPosition& pos) const U_OVERRIDE;
00972
00973 #ifndef U_HIDE_INTERNAL_API
00974
00986 UnicodeString& format(int32_t number, UnicodeString& appendTo, FieldPosition& pos,
00987 UErrorCode& status) const U_OVERRIDE;
00988 #endif
00989
01003 UnicodeString& format(int32_t number, UnicodeString& appendTo, FieldPositionIterator* posIter,
01004 UErrorCode& status) const U_OVERRIDE;
01005
01017 UnicodeString& format(int64_t number, UnicodeString& appendTo, FieldPosition& pos) const U_OVERRIDE;
01018
01019 #ifndef U_HIDE_INTERNAL_API
01020
01032 UnicodeString& format(int64_t number, UnicodeString& appendTo, FieldPosition& pos,
01033 UErrorCode& status) const U_OVERRIDE;
01034 #endif
01035
01049 UnicodeString& format(int64_t number, UnicodeString& appendTo, FieldPositionIterator* posIter,
01050 UErrorCode& status) const U_OVERRIDE;
01051
01068 UnicodeString& format(StringPiece number, UnicodeString& appendTo, FieldPositionIterator* posIter,
01069 UErrorCode& status) const U_OVERRIDE;
01070
01071 #ifndef U_HIDE_INTERNAL_API
01072
01088 UnicodeString& format(const number::impl::DecimalQuantity& number, UnicodeString& appendTo,
01089 FieldPositionIterator* posIter, UErrorCode& status) const U_OVERRIDE;
01090
01106 UnicodeString& format(const number::impl::DecimalQuantity& number, UnicodeString& appendTo,
01107 FieldPosition& pos, UErrorCode& status) const U_OVERRIDE;
01108
01109 #endif // U_HIDE_INTERNAL_API
01110
01111 using NumberFormat::parse;
01112
01132 void parse(const UnicodeString& text, Formattable& result,
01133 ParsePosition& parsePosition) const U_OVERRIDE;
01134
01154 CurrencyAmount* parseCurrency(const UnicodeString& text, ParsePosition& pos) const U_OVERRIDE;
01155
01163 virtual const DecimalFormatSymbols* getDecimalFormatSymbols(void) const;
01164
01171 virtual void adoptDecimalFormatSymbols(DecimalFormatSymbols* symbolsToAdopt);
01172
01179 virtual void setDecimalFormatSymbols(const DecimalFormatSymbols& symbols);
01180
01181
01188 virtual const CurrencyPluralInfo* getCurrencyPluralInfo(void) const;
01189
01196 virtual void adoptCurrencyPluralInfo(CurrencyPluralInfo* toAdopt);
01197
01204 virtual void setCurrencyPluralInfo(const CurrencyPluralInfo& info);
01205
01206
01215 UnicodeString& getPositivePrefix(UnicodeString& result) const;
01216
01224 virtual void setPositivePrefix(const UnicodeString& newValue);
01225
01234 UnicodeString& getNegativePrefix(UnicodeString& result) const;
01235
01243 virtual void setNegativePrefix(const UnicodeString& newValue);
01244
01253 UnicodeString& getPositiveSuffix(UnicodeString& result) const;
01254
01262 virtual void setPositiveSuffix(const UnicodeString& newValue);
01263
01272 UnicodeString& getNegativeSuffix(UnicodeString& result) const;
01273
01281 virtual void setNegativeSuffix(const UnicodeString& newValue);
01282
01283 #ifndef U_HIDE_DRAFT_API
01284
01292 UBool isSignAlwaysShown() const;
01293
01302 void setSignAlwaysShown(UBool value);
01303 #endif
01304
01317 int32_t getMultiplier(void) const;
01318
01332 virtual void setMultiplier(int32_t newValue);
01333
01334 #ifndef U_HIDE_DRAFT_API
01335
01347 int32_t getMultiplierScale(void) const;
01348
01368 void setMultiplierScale(int32_t newValue);
01369 #endif
01370
01380 virtual double getRoundingIncrement(void) const;
01381
01393 virtual void setRoundingIncrement(double newValue);
01394
01403 virtual ERoundingMode getRoundingMode(void) const U_OVERRIDE;
01404
01413 virtual void setRoundingMode(ERoundingMode roundingMode) U_OVERRIDE;
01414
01426 virtual int32_t getFormatWidth(void) const;
01427
01442 virtual void setFormatWidth(int32_t width);
01443
01456 virtual UnicodeString getPadCharacterString() const;
01457
01472 virtual void setPadCharacter(const UnicodeString& padChar);
01473
01489 virtual EPadPosition getPadPosition(void) const;
01490
01507 virtual void setPadPosition(EPadPosition padPos);
01508
01519 virtual UBool isScientificNotation(void) const;
01520
01536 virtual void setScientificNotation(UBool useScientific);
01537
01548 virtual int8_t getMinimumExponentDigits(void) const;
01549
01562 virtual void setMinimumExponentDigits(int8_t minExpDig);
01563
01576 virtual UBool isExponentSignAlwaysShown(void) const;
01577
01591 virtual void setExponentSignAlwaysShown(UBool expSignAlways);
01592
01604 int32_t getGroupingSize(void) const;
01605
01617 virtual void setGroupingSize(int32_t newValue);
01618
01637 int32_t getSecondaryGroupingSize(void) const;
01638
01650 virtual void setSecondaryGroupingSize(int32_t newValue);
01651
01652 #ifndef U_HIDE_DRAFT_API
01653
01676 int32_t getMinimumGroupingDigits() const;
01677
01688 void setMinimumGroupingDigits(int32_t newValue);
01689 #endif
01690
01691
01700 UBool isDecimalSeparatorAlwaysShown(void) const;
01701
01710 virtual void setDecimalSeparatorAlwaysShown(UBool newValue);
01711
01718 UBool isDecimalPatternMatchRequired(void) const;
01719
01729 virtual void setDecimalPatternMatchRequired(UBool newValue);
01730
01731 #ifndef U_HIDE_DRAFT_API
01732
01739 UBool isParseNoExponent() const;
01740
01749 void setParseNoExponent(UBool value);
01750
01758 UBool isParseCaseSensitive() const;
01759
01771 void setParseCaseSensitive(UBool value);
01772
01781 UBool isFormatFailIfMoreThanMaxDigits() const;
01782
01790 void setFormatFailIfMoreThanMaxDigits(UBool value);
01791 #endif
01792
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
02028 virtual void setCurrency(const char16_t* theCurrency);
02029
02038 void setCurrencyUsage(UCurrencyUsage newUsage, UErrorCode* ec);
02039
02044 UCurrencyUsage getCurrencyUsage() const;
02045
02046 #ifndef U_HIDE_INTERNAL_API
02047
02053 void formatToDecimalQuantity(double number, number::impl::DecimalQuantity& output,
02054 UErrorCode& status) const;
02055
02062 void formatToDecimalQuantity(const Formattable& number, number::impl::DecimalQuantity& output,
02063 UErrorCode& status) const;
02064
02065 #endif
02066
02067 #ifndef U_HIDE_DRAFT_API
02068
02113 const number::LocalizedNumberFormatter* toNumberFormatter(UErrorCode& status) const;
02114 #endif
02115
02116 #ifndef U_HIDE_DEPRECATED_API
02117
02129 const number::LocalizedNumberFormatter& toNumberFormatter() const;
02130 #endif
02131
02143 static UClassID U_EXPORT2 getStaticClassID(void);
02144
02156 UClassID getDynamicClassID(void) const U_OVERRIDE;
02157
02158 private:
02159
02161 void touch(UErrorCode& status);
02162
02164 void touchNoError();
02165
02177 void setPropertiesFromPattern(const UnicodeString& pattern, int32_t ignoreRounding,
02178 UErrorCode& status);
02179
02180 const numparse::impl::NumberParserImpl* getParser(UErrorCode& status) const;
02181
02182 const numparse::impl::NumberParserImpl* getCurrencyParser(UErrorCode& status) const;
02183
02184 static void fieldPositionHelper(const number::FormattedNumber& formatted, FieldPosition& fieldPosition,
02185 int32_t offset, UErrorCode& status);
02186
02187 static void fieldPositionIteratorHelper(const number::FormattedNumber& formatted,
02188 FieldPositionIterator* fpi, int32_t offset, UErrorCode& status);
02189
02190 void setupFastFormat();
02191
02192 bool fastFormatDouble(double input, UnicodeString& output) const;
02193
02194 bool fastFormatInt64(int64_t input, UnicodeString& output) const;
02195
02196 void doFastFormatInt32(int32_t input, bool isNegative, UnicodeString& output) const;
02197
02198
02199
02200
02201
02202
02203
02204
02205 number::impl::DecimalFormatFields* fields = nullptr;
02206
02207
02208 friend class CompactDecimalFormat;
02209
02210
02211 friend class MeasureFormat;
02212
02213 };
02214
02215 U_NAMESPACE_END
02216
02217 #endif
02218
02219 #endif // _DECIMFMT
02220