164339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert// Copyright (C) 2016 and later: Unicode, Inc. and others. 264339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html 3c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert/* 4c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert******************************************************************************* 5c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert* Copyright (C) 2015, International Business Machines Corporation and * 6c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert* others. All Rights Reserved. * 7c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert******************************************************************************* 8c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert*/ 9c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 10c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#ifndef VALUEFORMATTER_H 11c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#define VALUEFORMATTER_H 12c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 13c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#if !UCONFIG_NO_FORMATTING 14c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 15c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#include "unicode/uobject.h" 16c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#include "unicode/utypes.h" 17c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 18c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 19c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 20c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik RoubertU_NAMESPACE_BEGIN 21c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 22c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertclass UnicodeString; 23c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertclass DigitList; 24c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertclass FieldPositionHandler; 25c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertclass DigitGrouping; 26c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertclass PluralRules; 27c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertclass FixedPrecision; 28c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertclass DigitFormatter; 29c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertclass DigitFormatterOptions; 30c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertclass ScientificPrecision; 31c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertclass SciFormatterOptions; 32c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertclass FixedDecimal; 33c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertclass VisibleDigitsWithExponent; 34c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 35c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 36c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert/** 37c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * A closure around rounding and formatting a value. As these instances are 38c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * designed to be short lived (they only exist while formatting a value), they 39c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * do not own their own attributes. Rather the caller maintains ownership of 40c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * all attributes. A caller first calls a prepareXXX method on an instance 41c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * to share its data before using that instance. Using an 42c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * instance without first calling a prepareXXX method results in an 43c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * assertion error and a program crash. 44c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert */ 45c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertclass U_I18N_API ValueFormatter : public UObject { 46c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertpublic: 47c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert ValueFormatter() : fType(kFormatTypeCount) { 48c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 49c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 50c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert virtual ~ValueFormatter(); 51c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 52c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert /** 53c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * This function is here only to support the protected round() method 54c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * in DecimalFormat. It serves no ther purpose than that. 55c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * 56c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * @param value this value is rounded in place. 57c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * @param status any error returned here. 58c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert */ 59c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert DigitList &round(DigitList &value, UErrorCode &status) const; 60c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 61c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert /** 62c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * Returns TRUE if the absolute value of value can be fast formatted 63c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * using ValueFormatter::formatInt32. 64c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert */ 65c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UBool isFastFormattable(int32_t value) const; 66c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 67c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert /** 68c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * Converts value to a VisibleDigitsWithExponent. 69c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * Result may be fixed point or scientific. 70c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert */ 71c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert VisibleDigitsWithExponent &toVisibleDigitsWithExponent( 72c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert int64_t value, 73c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert VisibleDigitsWithExponent &digits, 74c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UErrorCode &status) const; 75c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 76c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert /** 77c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * Converts value to a VisibleDigitsWithExponent. 78c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * Result may be fixed point or scientific. 79c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert */ 80c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert VisibleDigitsWithExponent &toVisibleDigitsWithExponent( 81c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert DigitList &value, 82c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert VisibleDigitsWithExponent &digits, 83c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UErrorCode &status) const; 84c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 85c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert /** 86c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * formats positiveValue and appends to appendTo. Returns appendTo. 87c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * @param positiveValue If negative, no negative sign is formatted. 88c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * @param handler stores the field positions 89c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * @param appendTo formatted value appended here. 90c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert */ 91c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UnicodeString &format( 92c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert const VisibleDigitsWithExponent &positiveValue, 93c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert FieldPositionHandler &handler, 94c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UnicodeString &appendTo) const; 95c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 96c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 97c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert /** 98c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * formats positiveValue and appends to appendTo. Returns appendTo. 99c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * value must be positive. Calling formatInt32 to format a value when 100c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * isFastFormattable indicates that the value cannot be fast formatted 101c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * results in undefined behavior. 102c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert */ 103c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UnicodeString &formatInt32( 104c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert int32_t positiveValue, 105c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert FieldPositionHandler &handler, 106c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UnicodeString &appendTo) const; 107c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 108c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert /** 109c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * Returns the number of code points needed to format. 110c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * @param positiveValue if negative, the negative sign is not included 111c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * in count. 112c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert */ 113c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert int32_t countChar32( 114c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert const VisibleDigitsWithExponent &positiveValue) const; 115c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 116c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert /** 117c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * Prepares this instance for fixed decimal formatting. 118c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert */ 119c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert void prepareFixedDecimalFormatting( 120c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert const DigitFormatter &formatter, 121c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert const DigitGrouping &grouping, 122c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert const FixedPrecision &precision, 123c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert const DigitFormatterOptions &options); 124c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 125c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert /** 126c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert * Prepares this instance for scientific formatting. 127c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert */ 128c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert void prepareScientificFormatting( 129c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert const DigitFormatter &formatter, 130c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert const ScientificPrecision &precision, 131c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert const SciFormatterOptions &options); 132c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 133c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertprivate: 134c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert ValueFormatter(const ValueFormatter &); 135c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert ValueFormatter &operator=(const ValueFormatter &); 136c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert enum FormatType { 137c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert kFixedDecimal, 138c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert kScientificNotation, 139c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert kFormatTypeCount 140c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert }; 141c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 142c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert FormatType fType; 143c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 144c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert // for fixed decimal and scientific formatting 145c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert const DigitFormatter *fDigitFormatter; 146c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 147c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert // for fixed decimal formatting 148c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert const FixedPrecision *fFixedPrecision; 149c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert const DigitFormatterOptions *fFixedOptions; 150c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert const DigitGrouping *fGrouping; 151c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 152c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert // for scientific formatting 153c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert const ScientificPrecision *fScientificPrecision; 154c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert const SciFormatterOptions *fScientificOptions; 155c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert}; 156c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 157c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik RoubertU_NAMESPACE_END 158c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 159c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#endif /* !UCONFIG_NO_FORMATTING */ 160c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert 161c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#endif /* VALUEFORMATTER_H */ 162