// © 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. * ******************************************************************************* */ #ifndef VALUEFORMATTER_H #define VALUEFORMATTER_H #if !UCONFIG_NO_FORMATTING #include "unicode/uobject.h" #include "unicode/utypes.h" U_NAMESPACE_BEGIN class UnicodeString; class DigitList; class FieldPositionHandler; class DigitGrouping; class PluralRules; class FixedPrecision; class DigitFormatter; class DigitFormatterOptions; class ScientificPrecision; class SciFormatterOptions; class FixedDecimal; class VisibleDigitsWithExponent; /** * A closure around rounding and formatting a value. As these instances are * designed to be short lived (they only exist while formatting a value), they * do not own their own attributes. Rather the caller maintains ownership of * all attributes. A caller first calls a prepareXXX method on an instance * to share its data before using that instance. Using an * instance without first calling a prepareXXX method results in an * assertion error and a program crash. */ class U_I18N_API ValueFormatter : public UObject { public: ValueFormatter() : fType(kFormatTypeCount) { } virtual ~ValueFormatter(); /** * This function is here only to support the protected round() method * in DecimalFormat. It serves no ther purpose than that. * * @param value this value is rounded in place. * @param status any error returned here. */ DigitList &round(DigitList &value, UErrorCode &status) const; /** * Returns TRUE if the absolute value of value can be fast formatted * using ValueFormatter::formatInt32. */ UBool isFastFormattable(int32_t value) const; /** * Converts value to a VisibleDigitsWithExponent. * Result may be fixed point or scientific. */ VisibleDigitsWithExponent &toVisibleDigitsWithExponent( int64_t value, VisibleDigitsWithExponent &digits, UErrorCode &status) const; /** * Converts value to a VisibleDigitsWithExponent. * Result may be fixed point or scientific. */ VisibleDigitsWithExponent &toVisibleDigitsWithExponent( DigitList &value, VisibleDigitsWithExponent &digits, UErrorCode &status) const; /** * formats positiveValue and appends to appendTo. Returns appendTo. * @param positiveValue If negative, no negative sign is formatted. * @param handler stores the field positions * @param appendTo formatted value appended here. */ UnicodeString &format( const VisibleDigitsWithExponent &positiveValue, FieldPositionHandler &handler, UnicodeString &appendTo) const; /** * formats positiveValue and appends to appendTo. Returns appendTo. * value must be positive. Calling formatInt32 to format a value when * isFastFormattable indicates that the value cannot be fast formatted * results in undefined behavior. */ UnicodeString &formatInt32( int32_t positiveValue, FieldPositionHandler &handler, UnicodeString &appendTo) const; /** * Returns the number of code points needed to format. * @param positiveValue if negative, the negative sign is not included * in count. */ int32_t countChar32( const VisibleDigitsWithExponent &positiveValue) const; /** * Prepares this instance for fixed decimal formatting. */ void prepareFixedDecimalFormatting( const DigitFormatter &formatter, const DigitGrouping &grouping, const FixedPrecision &precision, const DigitFormatterOptions &options); /** * Prepares this instance for scientific formatting. */ void prepareScientificFormatting( const DigitFormatter &formatter, const ScientificPrecision &precision, const SciFormatterOptions &options); private: ValueFormatter(const ValueFormatter &); ValueFormatter &operator=(const ValueFormatter &); enum FormatType { kFixedDecimal, kScientificNotation, kFormatTypeCount }; FormatType fType; // for fixed decimal and scientific formatting const DigitFormatter *fDigitFormatter; // for fixed decimal formatting const FixedPrecision *fFixedPrecision; const DigitFormatterOptions *fFixedOptions; const DigitGrouping *fGrouping; // for scientific formatting const ScientificPrecision *fScientificPrecision; const SciFormatterOptions *fScientificOptions; }; U_NAMESPACE_END #endif /* !UCONFIG_NO_FORMATTING */ #endif /* VALUEFORMATTER_H */