• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (C) 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      */
clone()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     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     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     class U_I18N_API MarkupStyle : public Style {
174     public:
MarkupStyle(const UnicodeString & beginMarkup,const UnicodeString & endMarkup)175         MarkupStyle(
176                 const UnicodeString &beginMarkup,
177                 const UnicodeString &endMarkup)
178                 : Style(),
179                   fBeginMarkup(beginMarkup),
180                   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
223