|
ICU 73.2
73.2
|
00001 // © 2016 and later: Unicode, Inc. and others. 00002 // License & terms of use: http://www.unicode.org/copyright.html 00003 /* 00004 ******************************************************************************** 00005 * Copyright (C) 1997-2016, International Business Machines 00006 * Corporation and others. All Rights Reserved. 00007 ******************************************************************************** 00008 * 00009 * File DECIMFMT.H 00010 * 00011 * Modification History: 00012 * 00013 * Date Name Description 00014 * 02/19/97 aliu Converted from java. 00015 * 03/20/97 clhuang Updated per C++ implementation. 00016 * 04/03/97 aliu Rewrote parsing and formatting completely, and 00017 * cleaned up and debugged. Actually works now. 00018 * 04/17/97 aliu Changed DigitCount to int per code review. 00019 * 07/10/97 helena Made ParsePosition a class and get rid of the function 00020 * hiding problems. 00021 * 09/09/97 aliu Ported over support for exponential formats. 00022 * 07/20/98 stephen Changed documentation 00023 * 01/30/13 emmons Added Scaling methods 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 /* U_HIDE_INTERNAL_API */ 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) override; 00807 00815 void setParseIntegerOnly(UBool value) override; 00816 00824 void setLenient(UBool enable) 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() override; 00894 00902 DecimalFormat* clone() const override; 00903 00912 bool operator==(const Format& other) const override; 00913 00914 00915 using NumberFormat::format; 00916 00928 UnicodeString& format(double number, UnicodeString& appendTo, FieldPosition& pos) const override; 00929 00930 #ifndef U_HIDE_INTERNAL_API 00931 00943 UnicodeString& format(double number, UnicodeString& appendTo, FieldPosition& pos, 00944 UErrorCode& status) const override; 00945 #endif /* U_HIDE_INTERNAL_API */ 00946 00960 UnicodeString& format(double number, UnicodeString& appendTo, FieldPositionIterator* posIter, 00961 UErrorCode& status) const override; 00962 00974 UnicodeString& format(int32_t number, UnicodeString& appendTo, FieldPosition& pos) const override; 00975 00976 #ifndef U_HIDE_INTERNAL_API 00977 00989 UnicodeString& format(int32_t number, UnicodeString& appendTo, FieldPosition& pos, 00990 UErrorCode& status) const override; 00991 #endif /* U_HIDE_INTERNAL_API */ 00992 01006 UnicodeString& format(int32_t number, UnicodeString& appendTo, FieldPositionIterator* posIter, 01007 UErrorCode& status) const override; 01008 01020 UnicodeString& format(int64_t number, UnicodeString& appendTo, FieldPosition& pos) const override; 01021 01022 #ifndef U_HIDE_INTERNAL_API 01023 01035 UnicodeString& format(int64_t number, UnicodeString& appendTo, FieldPosition& pos, 01036 UErrorCode& status) const override; 01037 #endif /* U_HIDE_INTERNAL_API */ 01038 01052 UnicodeString& format(int64_t number, UnicodeString& appendTo, FieldPositionIterator* posIter, 01053 UErrorCode& status) const override; 01054 01071 UnicodeString& format(StringPiece number, UnicodeString& appendTo, FieldPositionIterator* posIter, 01072 UErrorCode& status) const 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 override; 01093 01109 UnicodeString& format(const number::impl::DecimalQuantity& number, UnicodeString& appendTo, 01110 FieldPosition& pos, UErrorCode& status) const 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 override; 01137 01157 CurrencyAmount* parseCurrency(const UnicodeString& text, ParsePosition& pos) const 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 override; 01403 01412 virtual void setRoundingMode(ERoundingMode roundingMode) 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) override; 01914 01924 void setMinimumIntegerDigits(int32_t newValue) override; 01925 01935 void setMaximumFractionDigits(int32_t newValue) override; 01936 01946 void setMinimumFractionDigits(int32_t newValue) 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) 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 /* U_HIDE_INTERNAL_API */ 02068 02114 const number::LocalizedNumberFormatter* toNumberFormatter(UErrorCode& status) const; 02115 02127 static UClassID U_EXPORT2 getStaticClassID(void); 02128 02140 UClassID getDynamicClassID(void) const 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 // INSTANCE FIELDS // 02190 //=====================================================================================// 02191 02192 02193 // One instance field for the implementation, keep all fields inside of an implementation 02194 // class defined in number_mapper.h 02195 number::impl::DecimalFormatFields* fields = nullptr; 02196 02197 // Allow child class CompactDecimalFormat to access fProperties: 02198 friend class CompactDecimalFormat; 02199 02200 // Allow MeasureFormat to use fieldPositionHelper: 02201 friend class MeasureFormat; 02202 02203 }; 02204 02205 U_NAMESPACE_END 02206 02207 #endif /* #if !UCONFIG_NO_FORMATTING */ 02208 02209 #endif /* U_SHOW_CPLUSPLUS_API */ 02210 02211 #endif // _DECIMFMT 02212 //eof
1.7.6.1