2 **********************************************************************
3 * Copyright (c) 2014, International Business Machines
4 * Corporation and others. All Rights Reserved.
5 **********************************************************************
7 #ifndef SCINUMBERFORMATTER_H
8 #define SCINUMBERFORMATTER_H
10 #include "unicode/utypes.h"
12 #if !UCONFIG_NO_FORMATTING
14 #ifndef U_HIDE_DRAFT_API
16 #include "unicode/unistr.h"
20 * \brief C++ API: Formats in scientific notation.
25 class FieldPositionIterator
;
26 class DecimalFormatStaticSets
;
27 class DecimalFormatSymbols
;
32 * A formatter that formats numbers in user-friendly scientific notation.
36 * UErrorCode status = U_ZERO_ERROR;
37 * LocalPointer<ScientificNumberFormatter> fmt(
38 * ScientificNumberFormatter::createMarkupInstance(
39 * "en", "<sup>", "</sup>", status));
40 * if (U_FAILURE(status)) {
43 * UnicodeString appendTo;
44 * // appendTo = "1.23456x10<sup>-78</sup>"
45 * fmt->format(1.23456e-78, appendTo, status);
50 class U_I18N_API ScientificNumberFormatter
: public UObject
{
54 * Creates a ScientificNumberFormatter instance that uses
55 * superscript characters for exponents.
56 * @param fmtToAdopt The DecimalFormat which must be configured for
57 * scientific notation.
58 * @param status error returned here.
59 * @return The new ScientificNumberFormatter instance.
63 static ScientificNumberFormatter
*createSuperscriptInstance(
64 DecimalFormat
*fmtToAdopt
, UErrorCode
&status
);
67 * Creates a ScientificNumberFormatter instance that uses
68 * superscript characters for exponents for this locale.
69 * @param locale The locale
70 * @param status error returned here.
71 * @return The ScientificNumberFormatter instance.
75 static ScientificNumberFormatter
*createSuperscriptInstance(
76 const Locale
&locale
, UErrorCode
&status
);
80 * Creates a ScientificNumberFormatter instance that uses
81 * markup for exponents.
82 * @param fmtToAdopt The DecimalFormat which must be configured for
83 * scientific notation.
84 * @param beginMarkup the markup to start superscript.
85 * @param endMarkup the markup to end superscript.
86 * @param status error returned here.
87 * @return The new ScientificNumberFormatter instance.
91 static ScientificNumberFormatter
*createMarkupInstance(
92 DecimalFormat
*fmtToAdopt
,
93 const UnicodeString
&beginMarkup
,
94 const UnicodeString
&endMarkup
,
98 * Creates a ScientificNumberFormatter instance that uses
99 * markup for exponents for this locale.
100 * @param locale The locale
101 * @param beginMarkup the markup to start superscript.
102 * @param endMarkup the markup to end superscript.
103 * @param status error returned here.
104 * @return The ScientificNumberFormatter instance.
108 static ScientificNumberFormatter
*createMarkupInstance(
109 const Locale
&locale
,
110 const UnicodeString
&beginMarkup
,
111 const UnicodeString
&endMarkup
,
116 * Returns a copy of this object. Caller must free returned copy.
119 ScientificNumberFormatter
*clone() const {
120 return new ScientificNumberFormatter(*this);
127 virtual ~ScientificNumberFormatter();
130 * Formats a number into user friendly scientific notation.
132 * @param number the number to format.
133 * @param appendTo formatted string appended here.
134 * @param status any error returned here.
139 UnicodeString
&format(
140 const Formattable
&number
,
141 UnicodeString
&appendTo
,
142 UErrorCode
&status
) const;
144 class U_I18N_API Style
: public UObject
{
146 virtual Style
*clone() const = 0;
148 virtual UnicodeString
&format(
149 const UnicodeString
&original
,
150 FieldPositionIterator
&fpi
,
151 const UnicodeString
&preExponent
,
152 const DecimalFormatStaticSets
&decimalFormatSets
,
153 UnicodeString
&appendTo
,
154 UErrorCode
&status
) const = 0;
156 friend class ScientificNumberFormatter
;
159 class U_I18N_API SuperscriptStyle
: public Style
{
161 virtual Style
*clone() const;
163 virtual UnicodeString
&format(
164 const UnicodeString
&original
,
165 FieldPositionIterator
&fpi
,
166 const UnicodeString
&preExponent
,
167 const DecimalFormatStaticSets
&decimalFormatSets
,
168 UnicodeString
&appendTo
,
169 UErrorCode
&status
) const;
172 class U_I18N_API MarkupStyle
: public Style
{
175 const UnicodeString
&beginMarkup
,
176 const UnicodeString
&endMarkup
)
178 fBeginMarkup(beginMarkup
),
179 fEndMarkup(endMarkup
) { }
180 virtual Style
*clone() const;
182 virtual UnicodeString
&format(
183 const UnicodeString
&original
,
184 FieldPositionIterator
&fpi
,
185 const UnicodeString
&preExponent
,
186 const DecimalFormatStaticSets
&decimalFormatSets
,
187 UnicodeString
&appendTo
,
188 UErrorCode
&status
) const;
190 UnicodeString fBeginMarkup
;
191 UnicodeString fEndMarkup
;
194 ScientificNumberFormatter(
195 DecimalFormat
*fmtToAdopt
,
199 ScientificNumberFormatter(const ScientificNumberFormatter
&other
);
200 ScientificNumberFormatter
&operator=(const ScientificNumberFormatter
&);
202 static void getPreExponent(
203 const DecimalFormatSymbols
&dfs
, UnicodeString
&preExponent
);
205 static ScientificNumberFormatter
*createInstance(
206 DecimalFormat
*fmtToAdopt
,
210 UnicodeString fPreExponent
;
211 DecimalFormat
*fDecimalFormat
;
213 const DecimalFormatStaticSets
*fStaticSets
;
219 #endif /* U_HIDE_DRAFT_API */
221 #endif /* !UCONFIG_NO_FORMATTING */