2 *******************************************************************************
3 * Copyright (C) 2015, International Business Machines Corporation and
4 * others. All Rights Reserved.
5 *******************************************************************************
8 #include "unicode/plurrule.h"
9 #include "unicode/unistr.h"
10 #include "unicode/utypes.h"
12 #if !UCONFIG_NO_FORMATTING
14 #include "digitformatter.h"
15 #include "digitgrouping.h"
16 #include "digitinterval.h"
18 #include "precision.h"
19 #include "plurrule_impl.h"
20 #include "smallintformatter.h"
22 #include "valueformatter.h"
23 #include "visibledigits.h"
27 ValueFormatter::~ValueFormatter() {}
29 VisibleDigitsWithExponent
&
30 ValueFormatter::toVisibleDigitsWithExponent(
32 VisibleDigitsWithExponent
&digits
,
33 UErrorCode
&status
) const {
36 return fFixedPrecision
->initVisibleDigitsWithExponent(
37 value
, digits
, status
);
39 case kScientificNotation
:
40 return fScientificPrecision
->initVisibleDigitsWithExponent(
41 value
, digits
, status
);
50 VisibleDigitsWithExponent
&
51 ValueFormatter::toVisibleDigitsWithExponent(
53 VisibleDigitsWithExponent
&digits
,
54 UErrorCode
&status
) const {
57 return fFixedPrecision
->initVisibleDigitsWithExponent(
58 value
, digits
, status
);
60 case kScientificNotation
:
61 return fScientificPrecision
->initVisibleDigitsWithExponent(
62 value
, digits
, status
);
71 static UBool
isNoGrouping(
72 const DigitGrouping
&grouping
,
74 const FixedPrecision
&precision
) {
75 IntDigitCountRange
range(
76 precision
.fMin
.getIntDigitCount(),
77 precision
.fMax
.getIntDigitCount());
78 return grouping
.isNoGrouping(value
, range
);
82 ValueFormatter::isFastFormattable(int32_t value
) const {
86 if (value
== INT32_MIN
) {
92 return fFixedPrecision
->isFastFormattable() && fFixedOptions
->isFastFormattable() && isNoGrouping(*fGrouping
, value
, *fFixedPrecision
);
94 case kScientificNotation
:
104 ValueFormatter::round(DigitList
&value
, UErrorCode
&status
) const {
105 if (value
.isNaN() || value
.isInfinite()) {
110 return fFixedPrecision
->round(value
, 0, status
);
111 case kScientificNotation
:
112 return fScientificPrecision
->round(value
, status
);
121 ValueFormatter::formatInt32(
123 FieldPositionHandler
&handler
,
124 UnicodeString
&appendTo
) const {
128 IntDigitCountRange
range(
129 fFixedPrecision
->fMin
.getIntDigitCount(),
130 fFixedPrecision
->fMax
.getIntDigitCount());
131 return fDigitFormatter
->formatPositiveInt32(
138 case kScientificNotation
:
147 ValueFormatter::format(
148 const VisibleDigitsWithExponent
&value
,
149 FieldPositionHandler
&handler
,
150 UnicodeString
&appendTo
) const {
153 return fDigitFormatter
->format(
160 case kScientificNotation
:
161 return fDigitFormatter
->format(
175 ValueFormatter::countChar32(const VisibleDigitsWithExponent
&value
) const {
178 return fDigitFormatter
->countChar32(
183 case kScientificNotation
:
184 return fDigitFormatter
->countChar32(
186 *fScientificOptions
);
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
;
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
;
221 #endif /* !UCONFIG_NO_FORMATTING */