Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(319)

Side by Side Diff: source/i18n/valueformatter.cpp

Issue 1621843002: ICU 56 update step 1 (Closed) Base URL: https://chromium.googlesource.com/chromium/deps/icu.git@561
Patch Set: Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « source/i18n/valueformatter.h ('k') | source/i18n/visibledigits.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 /*
2 *******************************************************************************
3 * Copyright (C) 2015, International Business Machines Corporation and
4 * others. All Rights Reserved.
5 *******************************************************************************
6 */
7
8 #include "unicode/plurrule.h"
9 #include "unicode/unistr.h"
10 #include "unicode/utypes.h"
11
12 #if !UCONFIG_NO_FORMATTING
13
14 #include "digitformatter.h"
15 #include "digitgrouping.h"
16 #include "digitinterval.h"
17 #include "digitlst.h"
18 #include "precision.h"
19 #include "plurrule_impl.h"
20 #include "smallintformatter.h"
21 #include "uassert.h"
22 #include "valueformatter.h"
23 #include "visibledigits.h"
24
25 U_NAMESPACE_BEGIN
26
27 ValueFormatter::~ValueFormatter() {}
28
29 VisibleDigitsWithExponent &
30 ValueFormatter::toVisibleDigitsWithExponent(
31 int64_t value,
32 VisibleDigitsWithExponent &digits,
33 UErrorCode &status) const {
34 switch (fType) {
35 case kFixedDecimal:
36 return fFixedPrecision->initVisibleDigitsWithExponent(
37 value, digits, status);
38 break;
39 case kScientificNotation:
40 return fScientificPrecision->initVisibleDigitsWithExponent(
41 value, digits, status);
42 break;
43 default:
44 U_ASSERT(FALSE);
45 break;
46 }
47 return digits;
48 }
49
50 VisibleDigitsWithExponent &
51 ValueFormatter::toVisibleDigitsWithExponent(
52 DigitList &value,
53 VisibleDigitsWithExponent &digits,
54 UErrorCode &status) const {
55 switch (fType) {
56 case kFixedDecimal:
57 return fFixedPrecision->initVisibleDigitsWithExponent(
58 value, digits, status);
59 break;
60 case kScientificNotation:
61 return fScientificPrecision->initVisibleDigitsWithExponent(
62 value, digits, status);
63 break;
64 default:
65 U_ASSERT(FALSE);
66 break;
67 }
68 return digits;
69 }
70
71 static UBool isNoGrouping(
72 const DigitGrouping &grouping,
73 int32_t value,
74 const FixedPrecision &precision) {
75 IntDigitCountRange range(
76 precision.fMin.getIntDigitCount(),
77 precision.fMax.getIntDigitCount());
78 return grouping.isNoGrouping(value, range);
79 }
80
81 UBool
82 ValueFormatter::isFastFormattable(int32_t value) const {
83 switch (fType) {
84 case kFixedDecimal:
85 {
86 if (value == INT32_MIN) {
87 return FALSE;
88 }
89 if (value < 0) {
90 value = -value;
91 }
92 return fFixedPrecision->isFastFormattable() && fFixedOptions->isFast Formattable() && isNoGrouping(*fGrouping, value, *fFixedPrecision);
93 }
94 case kScientificNotation:
95 return FALSE;
96 default:
97 U_ASSERT(FALSE);
98 break;
99 }
100 return FALSE;
101 }
102
103 DigitList &
104 ValueFormatter::round(DigitList &value, UErrorCode &status) const {
105 if (value.isNaN() || value.isInfinite()) {
106 return value;
107 }
108 switch (fType) {
109 case kFixedDecimal:
110 return fFixedPrecision->round(value, 0, status);
111 case kScientificNotation:
112 return fScientificPrecision->round(value, status);
113 default:
114 U_ASSERT(FALSE);
115 break;
116 }
117 return value;
118 }
119
120 UnicodeString &
121 ValueFormatter::formatInt32(
122 int32_t value,
123 FieldPositionHandler &handler,
124 UnicodeString &appendTo) const {
125 switch (fType) {
126 case kFixedDecimal:
127 {
128 IntDigitCountRange range(
129 fFixedPrecision->fMin.getIntDigitCount(),
130 fFixedPrecision->fMax.getIntDigitCount());
131 return fDigitFormatter->formatPositiveInt32(
132 value,
133 range,
134 handler,
135 appendTo);
136 }
137 break;
138 case kScientificNotation:
139 default:
140 U_ASSERT(FALSE);
141 break;
142 }
143 return appendTo;
144 }
145
146 UnicodeString &
147 ValueFormatter::format(
148 const VisibleDigitsWithExponent &value,
149 FieldPositionHandler &handler,
150 UnicodeString &appendTo) const {
151 switch (fType) {
152 case kFixedDecimal:
153 return fDigitFormatter->format(
154 value.getMantissa(),
155 *fGrouping,
156 *fFixedOptions,
157 handler,
158 appendTo);
159 break;
160 case kScientificNotation:
161 return fDigitFormatter->format(
162 value,
163 *fScientificOptions,
164 handler,
165 appendTo);
166 break;
167 default:
168 U_ASSERT(FALSE);
169 break;
170 }
171 return appendTo;
172 }
173
174 int32_t
175 ValueFormatter::countChar32(const VisibleDigitsWithExponent &value) const {
176 switch (fType) {
177 case kFixedDecimal:
178 return fDigitFormatter->countChar32(
179 value.getMantissa(),
180 *fGrouping,
181 *fFixedOptions);
182 break;
183 case kScientificNotation:
184 return fDigitFormatter->countChar32(
185 value,
186 *fScientificOptions);
187 break;
188 default:
189 U_ASSERT(FALSE);
190 break;
191 }
192 return 0;
193 }
194
195 void
196 ValueFormatter::prepareFixedDecimalFormatting(
197 const DigitFormatter &formatter,
198 const DigitGrouping &grouping,
199 const FixedPrecision &precision,
200 const DigitFormatterOptions &options) {
201 fType = kFixedDecimal;
202 fDigitFormatter = &formatter;
203 fGrouping = &grouping;
204 fFixedPrecision = &precision;
205 fFixedOptions = &options;
206 }
207
208 void
209 ValueFormatter::prepareScientificFormatting(
210 const DigitFormatter &formatter,
211 const ScientificPrecision &precision,
212 const SciFormatterOptions &options) {
213 fType = kScientificNotation;
214 fDigitFormatter = &formatter;
215 fScientificPrecision = &precision;
216 fScientificOptions = &options;
217 }
218
219 U_NAMESPACE_END
220
221 #endif /* !UCONFIG_NO_FORMATTING */
OLDNEW
« no previous file with comments | « source/i18n/valueformatter.h ('k') | source/i18n/visibledigits.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698