]> git.saurik.com Git - apple/icu.git/blame_incremental - icuSources/i18n/valueformatter.h
ICU-57131.0.1.tar.gz
[apple/icu.git] / icuSources / i18n / valueformatter.h
... / ...
CommitLineData
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
18U_NAMESPACE_BEGIN
19
20class UnicodeString;
21class DigitList;
22class FieldPositionHandler;
23class DigitGrouping;
24class PluralRules;
25class FixedPrecision;
26class DigitFormatter;
27class DigitFormatterOptions;
28class ScientificPrecision;
29class SciFormatterOptions;
30class FixedDecimal;
31class 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 */
43class U_I18N_API ValueFormatter : public UObject {
44public:
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
131private:
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
155U_NAMESPACE_END
156
157#endif /* !UCONFIG_NO_FORMATTING */
158
159#endif /* VALUEFORMATTER_H */