Team Ai
Datasetpublic

codekingpro/portable-devtools

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