Line data Source code
1 : // © 2016 and later: Unicode, Inc. and others.
2 : // License & terms of use: http://www.unicode.org/copyright.html
3 : /*
4 : **********************************************************************
5 : * Copyright (c) 2014-2016, International Business Machines
6 : * Corporation and others. All Rights Reserved.
7 : **********************************************************************
8 : */
9 : #ifndef SCINUMBERFORMATTER_H
10 : #define SCINUMBERFORMATTER_H
11 :
12 : #include "unicode/utypes.h"
13 :
14 : #if !UCONFIG_NO_FORMATTING
15 :
16 :
17 : #include "unicode/unistr.h"
18 :
19 : /**
20 : * \file
21 : * \brief C++ API: Formats in scientific notation.
22 : */
23 :
24 : U_NAMESPACE_BEGIN
25 :
26 : class FieldPositionIterator;
27 : class DecimalFormatStaticSets;
28 : class DecimalFormatSymbols;
29 : class DecimalFormat;
30 : class Formattable;
31 :
32 : /**
33 : * A formatter that formats numbers in user-friendly scientific notation.
34 : *
35 : * Sample code:
36 : * <pre>
37 : * UErrorCode status = U_ZERO_ERROR;
38 : * LocalPointer<ScientificNumberFormatter> fmt(
39 : * ScientificNumberFormatter::createMarkupInstance(
40 : * "en", "<sup>", "</sup>", status));
41 : * if (U_FAILURE(status)) {
42 : * return;
43 : * }
44 : * UnicodeString appendTo;
45 : * // appendTo = "1.23456x10<sup>-78</sup>"
46 : * fmt->format(1.23456e-78, appendTo, status);
47 : * </pre>
48 : *
49 : * @stable ICU 55
50 : */
51 : class U_I18N_API ScientificNumberFormatter : public UObject {
52 : public:
53 :
54 : /**
55 : * Creates a ScientificNumberFormatter instance that uses
56 : * superscript characters for exponents.
57 : * @param fmtToAdopt The DecimalFormat which must be configured for
58 : * scientific notation.
59 : * @param status error returned here.
60 : * @return The new ScientificNumberFormatter instance.
61 : *
62 : * @stable ICU 55
63 : */
64 : static ScientificNumberFormatter *createSuperscriptInstance(
65 : DecimalFormat *fmtToAdopt, UErrorCode &status);
66 :
67 : /**
68 : * Creates a ScientificNumberFormatter instance that uses
69 : * superscript characters for exponents for this locale.
70 : * @param locale The locale
71 : * @param status error returned here.
72 : * @return The ScientificNumberFormatter instance.
73 : *
74 : * @stable ICU 55
75 : */
76 : static ScientificNumberFormatter *createSuperscriptInstance(
77 : const Locale &locale, UErrorCode &status);
78 :
79 :
80 : /**
81 : * Creates a ScientificNumberFormatter instance that uses
82 : * markup for exponents.
83 : * @param fmtToAdopt The DecimalFormat which must be configured for
84 : * scientific notation.
85 : * @param beginMarkup the markup to start superscript.
86 : * @param endMarkup the markup to end superscript.
87 : * @param status error returned here.
88 : * @return The new ScientificNumberFormatter instance.
89 : *
90 : * @stable ICU 55
91 : */
92 : static ScientificNumberFormatter *createMarkupInstance(
93 : DecimalFormat *fmtToAdopt,
94 : const UnicodeString &beginMarkup,
95 : const UnicodeString &endMarkup,
96 : UErrorCode &status);
97 :
98 : /**
99 : * Creates a ScientificNumberFormatter instance that uses
100 : * markup for exponents for this locale.
101 : * @param locale The locale
102 : * @param beginMarkup the markup to start superscript.
103 : * @param endMarkup the markup to end superscript.
104 : * @param status error returned here.
105 : * @return The ScientificNumberFormatter instance.
106 : *
107 : * @stable ICU 55
108 : */
109 : static ScientificNumberFormatter *createMarkupInstance(
110 : const Locale &locale,
111 : const UnicodeString &beginMarkup,
112 : const UnicodeString &endMarkup,
113 : UErrorCode &status);
114 :
115 :
116 : /**
117 : * Returns a copy of this object. Caller must free returned copy.
118 : * @stable ICU 55
119 : */
120 : ScientificNumberFormatter *clone() const {
121 : return new ScientificNumberFormatter(*this);
122 : }
123 :
124 : /**
125 : * Destructor.
126 : * @stable ICU 55
127 : */
128 : virtual ~ScientificNumberFormatter();
129 :
130 : /**
131 : * Formats a number into user friendly scientific notation.
132 : *
133 : * @param number the number to format.
134 : * @param appendTo formatted string appended here.
135 : * @param status any error returned here.
136 : * @return appendTo
137 : *
138 : * @stable ICU 55
139 : */
140 : UnicodeString &format(
141 : const Formattable &number,
142 : UnicodeString &appendTo,
143 : UErrorCode &status) const;
144 : private:
145 0 : class U_I18N_API Style : public UObject {
146 : public:
147 : virtual Style *clone() const = 0;
148 : protected:
149 : virtual UnicodeString &format(
150 : const UnicodeString &original,
151 : FieldPositionIterator &fpi,
152 : const UnicodeString &preExponent,
153 : const DecimalFormatStaticSets &decimalFormatSets,
154 : UnicodeString &appendTo,
155 : UErrorCode &status) const = 0;
156 : private:
157 : friend class ScientificNumberFormatter;
158 : };
159 :
160 0 : class U_I18N_API SuperscriptStyle : public Style {
161 : public:
162 : virtual Style *clone() const;
163 : protected:
164 : virtual UnicodeString &format(
165 : const UnicodeString &original,
166 : FieldPositionIterator &fpi,
167 : const UnicodeString &preExponent,
168 : const DecimalFormatStaticSets &decimalFormatSets,
169 : UnicodeString &appendTo,
170 : UErrorCode &status) const;
171 : };
172 :
173 0 : class U_I18N_API MarkupStyle : public Style {
174 : public:
175 0 : MarkupStyle(
176 : const UnicodeString &beginMarkup,
177 : const UnicodeString &endMarkup)
178 0 : : Style(),
179 : fBeginMarkup(beginMarkup),
180 0 : fEndMarkup(endMarkup) { }
181 : virtual Style *clone() const;
182 : protected:
183 : virtual UnicodeString &format(
184 : const UnicodeString &original,
185 : FieldPositionIterator &fpi,
186 : const UnicodeString &preExponent,
187 : const DecimalFormatStaticSets &decimalFormatSets,
188 : UnicodeString &appendTo,
189 : UErrorCode &status) const;
190 : private:
191 : UnicodeString fBeginMarkup;
192 : UnicodeString fEndMarkup;
193 : };
194 :
195 : ScientificNumberFormatter(
196 : DecimalFormat *fmtToAdopt,
197 : Style *styleToAdopt,
198 : UErrorCode &status);
199 :
200 : ScientificNumberFormatter(const ScientificNumberFormatter &other);
201 : ScientificNumberFormatter &operator=(const ScientificNumberFormatter &);
202 :
203 : static void getPreExponent(
204 : const DecimalFormatSymbols &dfs, UnicodeString &preExponent);
205 :
206 : static ScientificNumberFormatter *createInstance(
207 : DecimalFormat *fmtToAdopt,
208 : Style *styleToAdopt,
209 : UErrorCode &status);
210 :
211 : UnicodeString fPreExponent;
212 : DecimalFormat *fDecimalFormat;
213 : Style *fStyle;
214 : const DecimalFormatStaticSets *fStaticSets;
215 :
216 : };
217 :
218 : U_NAMESPACE_END
219 :
220 :
221 : #endif /* !UCONFIG_NO_FORMATTING */
222 : #endif
|