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