ICU 73.2  73.2
decimfmt.h
Go to the documentation of this file.
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