1 // Copyright (C) 2016 and later: Unicode, Inc. and others.
2 // License & terms of use: http://www.unicode.org/copyright.html
4 **********************************************************************
5 * Copyright (c) 2014-2016, International Business Machines
6 * Corporation and others. All Rights Reserved.
7 **********************************************************************
9 #ifndef SCINUMBERFORMATTER_H
10 #define SCINUMBERFORMATTER_H
12 #include "unicode/utypes.h"
14 #if !UCONFIG_NO_FORMATTING
17 #include "unicode/unistr.h"
21 * \brief C++ API: Formats in scientific notation.
26 class FieldPositionIterator;
27 class DecimalFormatStaticSets;
28 class DecimalFormatSymbols;
33 * A formatter that formats numbers in user-friendly scientific notation.
37 * UErrorCode status = U_ZERO_ERROR;
38 * LocalPointer<ScientificNumberFormatter> fmt(
39 * ScientificNumberFormatter::createMarkupInstance(
40 * "en", "<sup>", "</sup>", status));
41 * if (U_FAILURE(status)) {
44 * UnicodeString appendTo;
45 * // appendTo = "1.23456x10<sup>-78</sup>"
46 * fmt->format(1.23456e-78, appendTo, status);
51 class U_I18N_API ScientificNumberFormatter : public UObject {
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.
64 static ScientificNumberFormatter *createSuperscriptInstance(
65 DecimalFormat *fmtToAdopt, UErrorCode &status);
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.
76 static ScientificNumberFormatter *createSuperscriptInstance(
77 const Locale &locale, UErrorCode &status);
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.
92 static ScientificNumberFormatter *createMarkupInstance(
93 DecimalFormat *fmtToAdopt,
94 const UnicodeString &beginMarkup,
95 const UnicodeString &endMarkup,
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.
109 static ScientificNumberFormatter *createMarkupInstance(
110 const Locale &locale,
111 const UnicodeString &beginMarkup,
112 const UnicodeString &endMarkup,
117 * Returns a copy of this object. Caller must free returned copy.
120 ScientificNumberFormatter *clone() const {
121 return new ScientificNumberFormatter(*this);
128 virtual ~ScientificNumberFormatter();
131 * Formats a number into user friendly scientific notation.
133 * @param number the number to format.
134 * @param appendTo formatted string appended here.
135 * @param status any error returned here.
140 UnicodeString &format(
141 const Formattable &number,
142 UnicodeString &appendTo,
143 UErrorCode &status) const;
145 class U_I18N_API Style : public UObject {
147 virtual Style *clone() const = 0;
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;
157 friend class ScientificNumberFormatter;
160 class U_I18N_API SuperscriptStyle : public Style {
162 virtual Style *clone() const;
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;
173 class U_I18N_API MarkupStyle : public Style {
176 const UnicodeString &beginMarkup,
177 const UnicodeString &endMarkup)
179 fBeginMarkup(beginMarkup),
180 fEndMarkup(endMarkup) { }
181 virtual Style *clone() const;
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;
191 UnicodeString fBeginMarkup;
192 UnicodeString fEndMarkup;
195 ScientificNumberFormatter(
196 DecimalFormat *fmtToAdopt,
200 ScientificNumberFormatter(const ScientificNumberFormatter &other);
201 ScientificNumberFormatter &operator=(const ScientificNumberFormatter &);
203 static void getPreExponent(
204 const DecimalFormatSymbols &dfs, UnicodeString &preExponent);
206 static ScientificNumberFormatter *createInstance(
207 DecimalFormat *fmtToAdopt,
211 UnicodeString fPreExponent;
212 DecimalFormat *fDecimalFormat;
214 const DecimalFormatStaticSets *fStaticSets;
221 #endif /* !UCONFIG_NO_FORMATTING */