// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2015, International Business Machines * Corporation and others. All Rights Reserved. ******************************************************************************* * digitformatter.h * * created on: 2015jan06 * created by: Travis Keep */ #ifndef __DIGITFORMATTER_H__ #define __DIGITFORMATTER_H__ #include "unicode/uobject.h" #if !UCONFIG_NO_FORMATTING #include "unicode/utypes.h" #include "unicode/unistr.h" #include "digitaffix.h" U_NAMESPACE_BEGIN class DecimalFormatSymbols; class DigitList; class DigitGrouping; class DigitInterval; class UnicodeString; class FieldPositionHandler; class IntDigitCountRange; class VisibleDigits; class VisibleDigitsWithExponent; /** * Various options for formatting in fixed point. */ class U_I18N_API DigitFormatterOptions : public UMemory { public: DigitFormatterOptions() : fAlwaysShowDecimal(FALSE) { } /** * Returns TRUE if this object equals rhs. */ UBool equals(const DigitFormatterOptions &rhs) const { return ( fAlwaysShowDecimal == rhs.fAlwaysShowDecimal); } /** * Returns TRUE if these options allow for fast formatting of * integers. */ UBool isFastFormattable() const { return (fAlwaysShowDecimal == FALSE); } /** * If TRUE, show the decimal separator even when there are no fraction * digits. default is FALSE. */ UBool fAlwaysShowDecimal; }; /** * Various options for formatting an integer. */ class U_I18N_API DigitFormatterIntOptions : public UMemory { public: DigitFormatterIntOptions() : fAlwaysShowSign(FALSE) { } /** * Returns TRUE if this object equals rhs. */ UBool equals(const DigitFormatterIntOptions &rhs) const { return (fAlwaysShowSign == rhs.fAlwaysShowSign); } /** * If TRUE, always prefix the integer with its sign even if the number is * positive. Default is FALSE. */ UBool fAlwaysShowSign; }; /** * Options for formatting in scientific notation. */ class U_I18N_API SciFormatterOptions : public UMemory { public: /** * Returns TRUE if this object equals rhs. */ UBool equals(const SciFormatterOptions &rhs) const { return (fMantissa.equals(rhs.fMantissa) && fExponent.equals(rhs.fExponent)); } /** * Options for formatting the mantissa. */ DigitFormatterOptions fMantissa; /** * Options for formatting the exponent. */ DigitFormatterIntOptions fExponent; }; /** * Does fixed point formatting. * * This class only does fixed point formatting. It does no rounding before * formatting. */ class U_I18N_API DigitFormatter : public UMemory { public: /** * Decimal separator is period (.), Plus sign is plus (+), * minus sign is minus (-), grouping separator is comma (,), digits are 0-9. */ DigitFormatter(); /** * Let symbols determine the digits, decimal separator, * plus and mius sign, grouping separator, and possibly other settings. */ DigitFormatter(const DecimalFormatSymbols &symbols); /** * Change what this instance uses for digits, decimal separator, * plus and mius sign, grouping separator, and possibly other settings * according to symbols. */ void setDecimalFormatSymbols(const DecimalFormatSymbols &symbols); /** * Change what this instance uses for digits, decimal separator, * plus and mius sign, grouping separator, and possibly other settings * according to symbols in the context of monetary amounts. */ void setDecimalFormatSymbolsForMonetary(const DecimalFormatSymbols &symbols); /** * Fixed point formatting. * * @param positiveDigits the value to format * Negative sign can be present, but it won't show. * @param grouping controls how digit grouping is done * @param options formatting options * @param handler records field positions * @param appendTo formatted value appended here. * @return appendTo */ UnicodeString &format( const VisibleDigits &positiveDigits, const DigitGrouping &grouping, const DigitFormatterOptions &options, FieldPositionHandler &handler, UnicodeString &appendTo) const; /** * formats in scientifc notation. * @param positiveDigits the value to format. * Negative sign can be present, but it won't show. * @param options formatting options * @param handler records field positions. * @param appendTo formatted value appended here. */ UnicodeString &format( const VisibleDigitsWithExponent &positiveDigits, const SciFormatterOptions &options, FieldPositionHandler &handler, UnicodeString &appendTo) const; /** * Fixed point formatting of integers. * Always performed with no grouping and no decimal point. * * @param positiveValue the value to format must be positive. * @param range specifies minimum and maximum number of digits. * @param handler records field positions * @param appendTo formatted value appended here. * @return appendTo */ UnicodeString &formatPositiveInt32( int32_t positiveValue, const IntDigitCountRange &range, FieldPositionHandler &handler, UnicodeString &appendTo) const; /** * Counts how many code points are needed for fixed formatting. * If digits is negative, the negative sign is not included in the count. */ int32_t countChar32( const VisibleDigits &digits, const DigitGrouping &grouping, const DigitFormatterOptions &options) const; /** * Counts how many code points are needed for scientific formatting. * If digits is negative, the negative sign is not included in the count. */ int32_t countChar32( const VisibleDigitsWithExponent &digits, const SciFormatterOptions &options) const; /** * Returns TRUE if this object equals rhs. */ UBool equals(const DigitFormatter &rhs) const; private: UChar32 fLocalizedDigits[10]; UnicodeString fGroupingSeparator; UnicodeString fDecimal; UnicodeString fNegativeSign; UnicodeString fPositiveSign; DigitAffix fInfinity; DigitAffix fNan; UBool fIsStandardDigits; UnicodeString fExponent; UBool isStandardDigits() const; UnicodeString &formatDigits( const uint8_t *digits, int32_t count, const IntDigitCountRange &range, int32_t intField, FieldPositionHandler &handler, UnicodeString &appendTo) const; void setOtherDecimalFormatSymbols(const DecimalFormatSymbols &symbols); int32_t countChar32( const VisibleDigits &exponent, const DigitInterval &mantissaInterval, const SciFormatterOptions &options) const; UnicodeString &formatNaN( FieldPositionHandler &handler, UnicodeString &appendTo) const { return fNan.format(handler, appendTo); } int32_t countChar32ForNaN() const { return fNan.toString().countChar32(); } UnicodeString &formatInfinity( FieldPositionHandler &handler, UnicodeString &appendTo) const { return fInfinity.format(handler, appendTo); } int32_t countChar32ForInfinity() const { return fInfinity.toString().countChar32(); } UnicodeString &formatExponent( const VisibleDigits &digits, const DigitFormatterIntOptions &options, int32_t signField, int32_t intField, FieldPositionHandler &handler, UnicodeString &appendTo) const; int32_t countChar32( const DigitGrouping &grouping, const DigitInterval &interval, const DigitFormatterOptions &options) const; int32_t countChar32ForExponent( const VisibleDigits &exponent, const DigitFormatterIntOptions &options) const; }; U_NAMESPACE_END #endif /* #if !UCONFIG_NO_FORMATTING */ #endif // __DIGITFORMATTER_H__