xref: /aosp_15_r20/external/icu/libicu/cts_headers/unicode/numfmt.h (revision 0e209d3975ff4a8c132096b14b0e9364a753506e)
1*0e209d39SAndroid Build Coastguard Worker // © 2016 and later: Unicode, Inc. and others.
2*0e209d39SAndroid Build Coastguard Worker // License & terms of use: http://www.unicode.org/copyright.html
3*0e209d39SAndroid Build Coastguard Worker /*
4*0e209d39SAndroid Build Coastguard Worker ********************************************************************************
5*0e209d39SAndroid Build Coastguard Worker * Copyright (C) 1997-2016, International Business Machines Corporation and others.
6*0e209d39SAndroid Build Coastguard Worker * All Rights Reserved.
7*0e209d39SAndroid Build Coastguard Worker ********************************************************************************
8*0e209d39SAndroid Build Coastguard Worker *
9*0e209d39SAndroid Build Coastguard Worker * File NUMFMT.H
10*0e209d39SAndroid Build Coastguard Worker *
11*0e209d39SAndroid Build Coastguard Worker * Modification History:
12*0e209d39SAndroid Build Coastguard Worker *
13*0e209d39SAndroid Build Coastguard Worker *   Date        Name        Description
14*0e209d39SAndroid Build Coastguard Worker *   02/19/97    aliu        Converted from java.
15*0e209d39SAndroid Build Coastguard Worker *   03/18/97    clhuang     Updated per C++ implementation.
16*0e209d39SAndroid Build Coastguard Worker *   04/17/97    aliu        Changed DigitCount to int per code review.
17*0e209d39SAndroid Build Coastguard Worker *    07/20/98    stephen        JDK 1.2 sync up. Added scientific support.
18*0e209d39SAndroid Build Coastguard Worker *                            Changed naming conventions to match C++ guidelines
19*0e209d39SAndroid Build Coastguard Worker *                            Deprecated Java style constants (eg, INTEGER_FIELD)
20*0e209d39SAndroid Build Coastguard Worker ********************************************************************************
21*0e209d39SAndroid Build Coastguard Worker */
22*0e209d39SAndroid Build Coastguard Worker 
23*0e209d39SAndroid Build Coastguard Worker #ifndef NUMFMT_H
24*0e209d39SAndroid Build Coastguard Worker #define NUMFMT_H
25*0e209d39SAndroid Build Coastguard Worker 
26*0e209d39SAndroid Build Coastguard Worker 
27*0e209d39SAndroid Build Coastguard Worker #include "unicode/utypes.h"
28*0e209d39SAndroid Build Coastguard Worker 
29*0e209d39SAndroid Build Coastguard Worker #if U_SHOW_CPLUSPLUS_API
30*0e209d39SAndroid Build Coastguard Worker 
31*0e209d39SAndroid Build Coastguard Worker /**
32*0e209d39SAndroid Build Coastguard Worker  * \file
33*0e209d39SAndroid Build Coastguard Worker  * \brief C++ API: Compatibility APIs for number formatting.
34*0e209d39SAndroid Build Coastguard Worker  */
35*0e209d39SAndroid Build Coastguard Worker 
36*0e209d39SAndroid Build Coastguard Worker #if !UCONFIG_NO_FORMATTING
37*0e209d39SAndroid Build Coastguard Worker 
38*0e209d39SAndroid Build Coastguard Worker #include "unicode/unistr.h"
39*0e209d39SAndroid Build Coastguard Worker #include "unicode/format.h"
40*0e209d39SAndroid Build Coastguard Worker #include "unicode/unum.h" // UNumberFormatStyle
41*0e209d39SAndroid Build Coastguard Worker #include "unicode/locid.h"
42*0e209d39SAndroid Build Coastguard Worker #include "unicode/stringpiece.h"
43*0e209d39SAndroid Build Coastguard Worker #include "unicode/curramt.h"
44*0e209d39SAndroid Build Coastguard Worker #include "unicode/udisplaycontext.h"
45*0e209d39SAndroid Build Coastguard Worker 
46*0e209d39SAndroid Build Coastguard Worker class NumberFormatTest;
47*0e209d39SAndroid Build Coastguard Worker 
48*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_BEGIN
49*0e209d39SAndroid Build Coastguard Worker 
50*0e209d39SAndroid Build Coastguard Worker class SharedNumberFormat;
51*0e209d39SAndroid Build Coastguard Worker 
52*0e209d39SAndroid Build Coastguard Worker #if !UCONFIG_NO_SERVICE
53*0e209d39SAndroid Build Coastguard Worker class NumberFormatFactory;
54*0e209d39SAndroid Build Coastguard Worker class StringEnumeration;
55*0e209d39SAndroid Build Coastguard Worker #endif
56*0e209d39SAndroid Build Coastguard Worker 
57*0e209d39SAndroid Build Coastguard Worker /**
58*0e209d39SAndroid Build Coastguard Worker  * <p><strong>IMPORTANT:</strong> New users are strongly encouraged to see if
59*0e209d39SAndroid Build Coastguard Worker  * numberformatter.h fits their use case.  Although not deprecated, this header
60*0e209d39SAndroid Build Coastguard Worker  * is provided for backwards compatibility only.
61*0e209d39SAndroid Build Coastguard Worker  *
62*0e209d39SAndroid Build Coastguard Worker  * Abstract base class for all number formats.  Provides interface for
63*0e209d39SAndroid Build Coastguard Worker  * formatting and parsing a number.  Also provides methods for
64*0e209d39SAndroid Build Coastguard Worker  * determining which locales have number formats, and what their names
65*0e209d39SAndroid Build Coastguard Worker  * are.
66*0e209d39SAndroid Build Coastguard Worker  *
67*0e209d39SAndroid Build Coastguard Worker  * \headerfile unicode/numfmt.h "unicode/numfmt.h"
68*0e209d39SAndroid Build Coastguard Worker  * <P>
69*0e209d39SAndroid Build Coastguard Worker  * NumberFormat helps you to format and parse numbers for any locale.
70*0e209d39SAndroid Build Coastguard Worker  * Your code can be completely independent of the locale conventions
71*0e209d39SAndroid Build Coastguard Worker  * for decimal points, thousands-separators, or even the particular
72*0e209d39SAndroid Build Coastguard Worker  * decimal digits used, or whether the number format is even decimal.
73*0e209d39SAndroid Build Coastguard Worker  * <P>
74*0e209d39SAndroid Build Coastguard Worker  * To format a number for the current Locale, use one of the static
75*0e209d39SAndroid Build Coastguard Worker  * factory methods:
76*0e209d39SAndroid Build Coastguard Worker  * \code
77*0e209d39SAndroid Build Coastguard Worker  *    #include <iostream>
78*0e209d39SAndroid Build Coastguard Worker  *    #include "unicode/numfmt.h"
79*0e209d39SAndroid Build Coastguard Worker  *    #include "unicode/unistr.h"
80*0e209d39SAndroid Build Coastguard Worker  *    #include "unicode/ustream.h"
81*0e209d39SAndroid Build Coastguard Worker  *    using namespace std;
82*0e209d39SAndroid Build Coastguard Worker  *
83*0e209d39SAndroid Build Coastguard Worker  *    int main() {
84*0e209d39SAndroid Build Coastguard Worker  *        double myNumber = 7.0;
85*0e209d39SAndroid Build Coastguard Worker  *        UnicodeString myString;
86*0e209d39SAndroid Build Coastguard Worker  *        UErrorCode success = U_ZERO_ERROR;
87*0e209d39SAndroid Build Coastguard Worker  *        NumberFormat* nf = NumberFormat::createInstance(success);
88*0e209d39SAndroid Build Coastguard Worker  *        nf->format(myNumber, myString);
89*0e209d39SAndroid Build Coastguard Worker  *        cout << " Example 1: " << myString << endl;
90*0e209d39SAndroid Build Coastguard Worker  *    }
91*0e209d39SAndroid Build Coastguard Worker  * \endcode
92*0e209d39SAndroid Build Coastguard Worker  * Note that there are additional factory methods within subclasses of
93*0e209d39SAndroid Build Coastguard Worker  * NumberFormat.
94*0e209d39SAndroid Build Coastguard Worker  * <P>
95*0e209d39SAndroid Build Coastguard Worker  * If you are formatting multiple numbers, it is more efficient to get
96*0e209d39SAndroid Build Coastguard Worker  * the format and use it multiple times so that the system doesn't
97*0e209d39SAndroid Build Coastguard Worker  * have to fetch the information about the local language and country
98*0e209d39SAndroid Build Coastguard Worker  * conventions multiple times.
99*0e209d39SAndroid Build Coastguard Worker  * \code
100*0e209d39SAndroid Build Coastguard Worker  *     UnicodeString myString;
101*0e209d39SAndroid Build Coastguard Worker  *     UErrorCode success = U_ZERO_ERROR;
102*0e209d39SAndroid Build Coastguard Worker  *     NumberFormat *nf = NumberFormat::createInstance( success );
103*0e209d39SAndroid Build Coastguard Worker  *     for (int32_t number: {123, 3333, -1234567}) {
104*0e209d39SAndroid Build Coastguard Worker  *         nf->format(number, myString);
105*0e209d39SAndroid Build Coastguard Worker  *         myString += "; ";
106*0e209d39SAndroid Build Coastguard Worker  *     }
107*0e209d39SAndroid Build Coastguard Worker  *     cout << " Example 2: " << myString << endl;
108*0e209d39SAndroid Build Coastguard Worker  * \endcode
109*0e209d39SAndroid Build Coastguard Worker  * To format a number for a different Locale, specify it in the
110*0e209d39SAndroid Build Coastguard Worker  * call to \c createInstance().
111*0e209d39SAndroid Build Coastguard Worker  * \code
112*0e209d39SAndroid Build Coastguard Worker  *     nf = NumberFormat::createInstance(Locale::getFrench(), success);
113*0e209d39SAndroid Build Coastguard Worker  * \endcode
114*0e209d39SAndroid Build Coastguard Worker  * You can use a \c NumberFormat to parse also.
115*0e209d39SAndroid Build Coastguard Worker  * \code
116*0e209d39SAndroid Build Coastguard Worker  *    UErrorCode success;
117*0e209d39SAndroid Build Coastguard Worker  *    Formattable result(-999);  // initialized with error code
118*0e209d39SAndroid Build Coastguard Worker  *    nf->parse(myString, result, success);
119*0e209d39SAndroid Build Coastguard Worker  * \endcode
120*0e209d39SAndroid Build Coastguard Worker  * Use \c createInstance() to get the normal number format for a \c Locale.
121*0e209d39SAndroid Build Coastguard Worker  * There are other static factory methods available.  Use \c createCurrencyInstance()
122*0e209d39SAndroid Build Coastguard Worker  * to get the currency number format for that country.  Use \c createPercentInstance()
123*0e209d39SAndroid Build Coastguard Worker  * to get a format for displaying percentages. With this format, a
124*0e209d39SAndroid Build Coastguard Worker  * fraction from 0.53 is displayed as 53%.
125*0e209d39SAndroid Build Coastguard Worker  * <P>
126*0e209d39SAndroid Build Coastguard Worker  * The type of number formatting can be specified by passing a 'style' parameter to \c createInstance().
127*0e209d39SAndroid Build Coastguard Worker  * For example, use\n
128*0e209d39SAndroid Build Coastguard Worker  * \c createInstance(locale, UNUM_DECIMAL, errorCode) to get the normal number format,\n
129*0e209d39SAndroid Build Coastguard Worker  * \c createInstance(locale, UNUM_PERCENT, errorCode) to get a format for displaying percentage,\n
130*0e209d39SAndroid Build Coastguard Worker  * \c createInstance(locale, UNUM_SCIENTIFIC, errorCode) to get a format for displaying scientific number,\n
131*0e209d39SAndroid Build Coastguard Worker  * \c createInstance(locale, UNUM_CURRENCY, errorCode) to get the currency number format,
132*0e209d39SAndroid Build Coastguard Worker  * in which the currency is represented by its symbol, for example, "$3.00".\n
133*0e209d39SAndroid Build Coastguard Worker  * \c createInstance(locale, UNUM_CURRENCY_ISO, errorCode)  to get the currency number format,
134*0e209d39SAndroid Build Coastguard Worker  * in which the currency is represented by its ISO code, for example "USD3.00".\n
135*0e209d39SAndroid Build Coastguard Worker  * \c createInstance(locale, UNUM_CURRENCY_PLURAL, errorCode) to get the currency number format,
136*0e209d39SAndroid Build Coastguard Worker  * in which the currency is represented by its full name in plural format,
137*0e209d39SAndroid Build Coastguard Worker  * for example, "3.00 US dollars" or "1.00 US dollar".
138*0e209d39SAndroid Build Coastguard Worker  * <P>
139*0e209d39SAndroid Build Coastguard Worker  * You can also control the display of numbers with such methods as
140*0e209d39SAndroid Build Coastguard Worker  * \c getMinimumFractionDigits().  If you want even more control over the
141*0e209d39SAndroid Build Coastguard Worker  * format or parsing, or want to give your users more control, you can
142*0e209d39SAndroid Build Coastguard Worker  * try dynamic_casting the \c NumberFormat you get from the factory methods to a
143*0e209d39SAndroid Build Coastguard Worker  * \c DecimalFormat. This will work for the vast majority of
144*0e209d39SAndroid Build Coastguard Worker  * countries; just remember to test for nullptr in case you
145*0e209d39SAndroid Build Coastguard Worker  * encounter an unusual one.
146*0e209d39SAndroid Build Coastguard Worker  * <P>
147*0e209d39SAndroid Build Coastguard Worker  * You can also use forms of the parse and format methods with
148*0e209d39SAndroid Build Coastguard Worker  * \c ParsePosition and \c FieldPosition to allow you to:
149*0e209d39SAndroid Build Coastguard Worker  * <ul type=round>
150*0e209d39SAndroid Build Coastguard Worker  *   <li>(a) progressively parse through pieces of a string.
151*0e209d39SAndroid Build Coastguard Worker  *   <li>(b) align the decimal point and other areas.
152*0e209d39SAndroid Build Coastguard Worker  * </ul>
153*0e209d39SAndroid Build Coastguard Worker  * For example, you can align numbers in two ways.
154*0e209d39SAndroid Build Coastguard Worker  * <P>
155*0e209d39SAndroid Build Coastguard Worker  * If you are using a monospaced font with spacing for alignment, you
156*0e209d39SAndroid Build Coastguard Worker  * can pass the \c FieldPosition in your format call, with field =
157*0e209d39SAndroid Build Coastguard Worker  * \c UNUM_INTEGER_FIELD. On output, \c getEndIndex will be set to the offset
158*0e209d39SAndroid Build Coastguard Worker  * between the last character of the integer and the decimal. Add
159*0e209d39SAndroid Build Coastguard Worker  * (desiredSpaceCount - getEndIndex) spaces at the front of the
160*0e209d39SAndroid Build Coastguard Worker  * string.
161*0e209d39SAndroid Build Coastguard Worker  * <P>
162*0e209d39SAndroid Build Coastguard Worker  * If you are using proportional fonts, instead of padding with
163*0e209d39SAndroid Build Coastguard Worker  * spaces, measure the width of the string in pixels from the start to
164*0e209d39SAndroid Build Coastguard Worker  * getEndIndex.  Then move the pen by (desiredPixelWidth -
165*0e209d39SAndroid Build Coastguard Worker  * widthToAlignmentPoint) before drawing the text.  It also works
166*0e209d39SAndroid Build Coastguard Worker  * where there is no decimal, but possibly additional characters at
167*0e209d39SAndroid Build Coastguard Worker  * the end, e.g. with parentheses in negative numbers: "(12)" for -12.
168*0e209d39SAndroid Build Coastguard Worker  * <p>
169*0e209d39SAndroid Build Coastguard Worker  * <em>User subclasses are not supported.</em> While clients may write
170*0e209d39SAndroid Build Coastguard Worker  * subclasses, such code will not necessarily work and will not be
171*0e209d39SAndroid Build Coastguard Worker  * guaranteed to work stably from release to release.
172*0e209d39SAndroid Build Coastguard Worker  *
173*0e209d39SAndroid Build Coastguard Worker  * @stable ICU 2.0
174*0e209d39SAndroid Build Coastguard Worker  */
175*0e209d39SAndroid Build Coastguard Worker class U_I18N_API NumberFormat : public Format {
176*0e209d39SAndroid Build Coastguard Worker public:
177*0e209d39SAndroid Build Coastguard Worker     /**
178*0e209d39SAndroid Build Coastguard Worker      * Rounding mode.
179*0e209d39SAndroid Build Coastguard Worker      *
180*0e209d39SAndroid Build Coastguard Worker      * <p>
181*0e209d39SAndroid Build Coastguard Worker      * For more detail on rounding modes, see:
182*0e209d39SAndroid Build Coastguard Worker      * https://unicode-org.github.io/icu/userguide/format_parse/numbers/rounding-modes
183*0e209d39SAndroid Build Coastguard Worker      *
184*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.4
185*0e209d39SAndroid Build Coastguard Worker      */
186*0e209d39SAndroid Build Coastguard Worker     enum ERoundingMode {
187*0e209d39SAndroid Build Coastguard Worker         kRoundCeiling,  /**< Round towards positive infinity */
188*0e209d39SAndroid Build Coastguard Worker         kRoundFloor,    /**< Round towards negative infinity */
189*0e209d39SAndroid Build Coastguard Worker         kRoundDown,     /**< Round towards zero */
190*0e209d39SAndroid Build Coastguard Worker         kRoundUp,       /**< Round away from zero */
191*0e209d39SAndroid Build Coastguard Worker         kRoundHalfEven, /**< Round towards the nearest integer, or
192*0e209d39SAndroid Build Coastguard Worker                              towards the nearest even integer if equidistant */
193*0e209d39SAndroid Build Coastguard Worker         kRoundHalfDown, /**< Round towards the nearest integer, or
194*0e209d39SAndroid Build Coastguard Worker                              towards zero if equidistant */
195*0e209d39SAndroid Build Coastguard Worker         kRoundHalfUp,   /**< Round towards the nearest integer, or
196*0e209d39SAndroid Build Coastguard Worker                              away from zero if equidistant */
197*0e209d39SAndroid Build Coastguard Worker         /**
198*0e209d39SAndroid Build Coastguard Worker           *  Return U_FORMAT_INEXACT_ERROR if number does not format exactly.
199*0e209d39SAndroid Build Coastguard Worker           *  @stable ICU 4.8
200*0e209d39SAndroid Build Coastguard Worker           */
201*0e209d39SAndroid Build Coastguard Worker         kRoundUnnecessary,
202*0e209d39SAndroid Build Coastguard Worker         /**
203*0e209d39SAndroid Build Coastguard Worker          * Rounds ties toward the odd number.
204*0e209d39SAndroid Build Coastguard Worker          * @stable ICU 73
205*0e209d39SAndroid Build Coastguard Worker          */
206*0e209d39SAndroid Build Coastguard Worker         kRoundHalfOdd,
207*0e209d39SAndroid Build Coastguard Worker         /**
208*0e209d39SAndroid Build Coastguard Worker          * Rounds ties toward +∞.
209*0e209d39SAndroid Build Coastguard Worker          * @stable ICU 73
210*0e209d39SAndroid Build Coastguard Worker          */
211*0e209d39SAndroid Build Coastguard Worker         kRoundHalfCeiling,
212*0e209d39SAndroid Build Coastguard Worker         /**
213*0e209d39SAndroid Build Coastguard Worker          * Rounds ties toward -∞.
214*0e209d39SAndroid Build Coastguard Worker          * @stable ICU 73
215*0e209d39SAndroid Build Coastguard Worker          */
216*0e209d39SAndroid Build Coastguard Worker         kRoundHalfFloor,
217*0e209d39SAndroid Build Coastguard Worker     };
218*0e209d39SAndroid Build Coastguard Worker 
219*0e209d39SAndroid Build Coastguard Worker     /**
220*0e209d39SAndroid Build Coastguard Worker      * Alignment Field constants used to construct a FieldPosition object.
221*0e209d39SAndroid Build Coastguard Worker      * Signifies that the position of the integer part or fraction part of
222*0e209d39SAndroid Build Coastguard Worker      * a formatted number should be returned.
223*0e209d39SAndroid Build Coastguard Worker      *
224*0e209d39SAndroid Build Coastguard Worker      * Note: as of ICU 4.4, the values in this enum have been extended to
225*0e209d39SAndroid Build Coastguard Worker      * support identification of all number format fields, not just those
226*0e209d39SAndroid Build Coastguard Worker      * pertaining to alignment.
227*0e209d39SAndroid Build Coastguard Worker      *
228*0e209d39SAndroid Build Coastguard Worker      * These constants are provided for backwards compatibility only.
229*0e209d39SAndroid Build Coastguard Worker      * Please use the C style constants defined in the header file unum.h.
230*0e209d39SAndroid Build Coastguard Worker      *
231*0e209d39SAndroid Build Coastguard Worker      * @see FieldPosition
232*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
233*0e209d39SAndroid Build Coastguard Worker      */
234*0e209d39SAndroid Build Coastguard Worker     enum EAlignmentFields {
235*0e209d39SAndroid Build Coastguard Worker         /** @stable ICU 2.0 */
236*0e209d39SAndroid Build Coastguard Worker         kIntegerField = UNUM_INTEGER_FIELD,
237*0e209d39SAndroid Build Coastguard Worker         /** @stable ICU 2.0 */
238*0e209d39SAndroid Build Coastguard Worker         kFractionField = UNUM_FRACTION_FIELD,
239*0e209d39SAndroid Build Coastguard Worker         /** @stable ICU 2.0 */
240*0e209d39SAndroid Build Coastguard Worker         kDecimalSeparatorField = UNUM_DECIMAL_SEPARATOR_FIELD,
241*0e209d39SAndroid Build Coastguard Worker         /** @stable ICU 2.0 */
242*0e209d39SAndroid Build Coastguard Worker         kExponentSymbolField = UNUM_EXPONENT_SYMBOL_FIELD,
243*0e209d39SAndroid Build Coastguard Worker         /** @stable ICU 2.0 */
244*0e209d39SAndroid Build Coastguard Worker         kExponentSignField = UNUM_EXPONENT_SIGN_FIELD,
245*0e209d39SAndroid Build Coastguard Worker         /** @stable ICU 2.0 */
246*0e209d39SAndroid Build Coastguard Worker         kExponentField = UNUM_EXPONENT_FIELD,
247*0e209d39SAndroid Build Coastguard Worker         /** @stable ICU 2.0 */
248*0e209d39SAndroid Build Coastguard Worker         kGroupingSeparatorField = UNUM_GROUPING_SEPARATOR_FIELD,
249*0e209d39SAndroid Build Coastguard Worker         /** @stable ICU 2.0 */
250*0e209d39SAndroid Build Coastguard Worker         kCurrencyField = UNUM_CURRENCY_FIELD,
251*0e209d39SAndroid Build Coastguard Worker         /** @stable ICU 2.0 */
252*0e209d39SAndroid Build Coastguard Worker         kPercentField = UNUM_PERCENT_FIELD,
253*0e209d39SAndroid Build Coastguard Worker         /** @stable ICU 2.0 */
254*0e209d39SAndroid Build Coastguard Worker         kPermillField = UNUM_PERMILL_FIELD,
255*0e209d39SAndroid Build Coastguard Worker         /** @stable ICU 2.0 */
256*0e209d39SAndroid Build Coastguard Worker         kSignField = UNUM_SIGN_FIELD,
257*0e209d39SAndroid Build Coastguard Worker         /** @stable ICU 64 */
258*0e209d39SAndroid Build Coastguard Worker         kMeasureUnitField = UNUM_MEASURE_UNIT_FIELD,
259*0e209d39SAndroid Build Coastguard Worker         /** @stable ICU 64 */
260*0e209d39SAndroid Build Coastguard Worker         kCompactField = UNUM_COMPACT_FIELD,
261*0e209d39SAndroid Build Coastguard Worker 
262*0e209d39SAndroid Build Coastguard Worker     /**
263*0e209d39SAndroid Build Coastguard Worker      * These constants are provided for backwards compatibility only.
264*0e209d39SAndroid Build Coastguard Worker      * Please use the constants defined in the header file unum.h.
265*0e209d39SAndroid Build Coastguard Worker      */
266*0e209d39SAndroid Build Coastguard Worker         /** @stable ICU 2.0 */
267*0e209d39SAndroid Build Coastguard Worker         INTEGER_FIELD        = UNUM_INTEGER_FIELD,
268*0e209d39SAndroid Build Coastguard Worker         /** @stable ICU 2.0 */
269*0e209d39SAndroid Build Coastguard Worker         FRACTION_FIELD       = UNUM_FRACTION_FIELD
270*0e209d39SAndroid Build Coastguard Worker     };
271*0e209d39SAndroid Build Coastguard Worker 
272*0e209d39SAndroid Build Coastguard Worker     /**
273*0e209d39SAndroid Build Coastguard Worker      * Destructor.
274*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
275*0e209d39SAndroid Build Coastguard Worker      */
276*0e209d39SAndroid Build Coastguard Worker     virtual ~NumberFormat();
277*0e209d39SAndroid Build Coastguard Worker 
278*0e209d39SAndroid Build Coastguard Worker     /**
279*0e209d39SAndroid Build Coastguard Worker      * Clones this object polymorphically.
280*0e209d39SAndroid Build Coastguard Worker      * The caller owns the result and should delete it when done.
281*0e209d39SAndroid Build Coastguard Worker      * @return clone, or nullptr if an error occurred
282*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
283*0e209d39SAndroid Build Coastguard Worker      */
284*0e209d39SAndroid Build Coastguard Worker     virtual NumberFormat* clone() const override = 0;
285*0e209d39SAndroid Build Coastguard Worker 
286*0e209d39SAndroid Build Coastguard Worker     /**
287*0e209d39SAndroid Build Coastguard Worker      * Return true if the given Format objects are semantically equal.
288*0e209d39SAndroid Build Coastguard Worker      * Objects of different subclasses are considered unequal.
289*0e209d39SAndroid Build Coastguard Worker      * @return    true if the given Format objects are semantically equal.
290*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
291*0e209d39SAndroid Build Coastguard Worker      */
292*0e209d39SAndroid Build Coastguard Worker     virtual bool operator==(const Format& other) const override;
293*0e209d39SAndroid Build Coastguard Worker 
294*0e209d39SAndroid Build Coastguard Worker 
295*0e209d39SAndroid Build Coastguard Worker     using Format::format;
296*0e209d39SAndroid Build Coastguard Worker 
297*0e209d39SAndroid Build Coastguard Worker     /**
298*0e209d39SAndroid Build Coastguard Worker      * Format an object to produce a string.  This method handles
299*0e209d39SAndroid Build Coastguard Worker      * Formattable objects with numeric types. If the Formattable
300*0e209d39SAndroid Build Coastguard Worker      * object type is not a numeric type, then it returns a failing
301*0e209d39SAndroid Build Coastguard Worker      * UErrorCode.
302*0e209d39SAndroid Build Coastguard Worker      *
303*0e209d39SAndroid Build Coastguard Worker      * @param obj       The object to format.
304*0e209d39SAndroid Build Coastguard Worker      * @param appendTo  Output parameter to receive result.
305*0e209d39SAndroid Build Coastguard Worker      *                  Result is appended to existing contents.
306*0e209d39SAndroid Build Coastguard Worker      * @param pos       On input: an alignment field, if desired.
307*0e209d39SAndroid Build Coastguard Worker      *                  On output: the offsets of the alignment field.
308*0e209d39SAndroid Build Coastguard Worker      * @param status    Output param filled with success/failure status.
309*0e209d39SAndroid Build Coastguard Worker      * @return          Reference to 'appendTo' parameter.
310*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
311*0e209d39SAndroid Build Coastguard Worker      */
312*0e209d39SAndroid Build Coastguard Worker     virtual UnicodeString& format(const Formattable& obj,
313*0e209d39SAndroid Build Coastguard Worker                                   UnicodeString& appendTo,
314*0e209d39SAndroid Build Coastguard Worker                                   FieldPosition& pos,
315*0e209d39SAndroid Build Coastguard Worker                                   UErrorCode& status) const override;
316*0e209d39SAndroid Build Coastguard Worker 
317*0e209d39SAndroid Build Coastguard Worker     /**
318*0e209d39SAndroid Build Coastguard Worker      * Format an object to produce a string.  This method handles
319*0e209d39SAndroid Build Coastguard Worker      * Formattable objects with numeric types. If the Formattable
320*0e209d39SAndroid Build Coastguard Worker      * object type is not a numeric type, then it returns a failing
321*0e209d39SAndroid Build Coastguard Worker      * UErrorCode.
322*0e209d39SAndroid Build Coastguard Worker      *
323*0e209d39SAndroid Build Coastguard Worker      * @param obj       The object to format.
324*0e209d39SAndroid Build Coastguard Worker      * @param appendTo  Output parameter to receive result.
325*0e209d39SAndroid Build Coastguard Worker      *                  Result is appended to existing contents.
326*0e209d39SAndroid Build Coastguard Worker      * @param posIter   On return, can be used to iterate over positions
327*0e209d39SAndroid Build Coastguard Worker      *                  of fields generated by this format call.  Can be
328*0e209d39SAndroid Build Coastguard Worker      *                  nullptr.
329*0e209d39SAndroid Build Coastguard Worker      * @param status    Output param filled with success/failure status.
330*0e209d39SAndroid Build Coastguard Worker      * @return          Reference to 'appendTo' parameter.
331*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 4.4
332*0e209d39SAndroid Build Coastguard Worker      */
333*0e209d39SAndroid Build Coastguard Worker     virtual UnicodeString& format(const Formattable& obj,
334*0e209d39SAndroid Build Coastguard Worker                                   UnicodeString& appendTo,
335*0e209d39SAndroid Build Coastguard Worker                                   FieldPositionIterator* posIter,
336*0e209d39SAndroid Build Coastguard Worker                                   UErrorCode& status) const override;
337*0e209d39SAndroid Build Coastguard Worker 
338*0e209d39SAndroid Build Coastguard Worker     /**
339*0e209d39SAndroid Build Coastguard Worker      * Parse a string to produce an object.  This methods handles
340*0e209d39SAndroid Build Coastguard Worker      * parsing of numeric strings into Formattable objects with numeric
341*0e209d39SAndroid Build Coastguard Worker      * types.
342*0e209d39SAndroid Build Coastguard Worker      * <P>
343*0e209d39SAndroid Build Coastguard Worker      * Before calling, set parse_pos.index to the offset you want to
344*0e209d39SAndroid Build Coastguard Worker      * start parsing at in the source. After calling, parse_pos.index
345*0e209d39SAndroid Build Coastguard Worker      * indicates the position after the successfully parsed text.  If
346*0e209d39SAndroid Build Coastguard Worker      * an error occurs, parse_pos.index is unchanged.
347*0e209d39SAndroid Build Coastguard Worker      * <P>
348*0e209d39SAndroid Build Coastguard Worker      * When parsing, leading whitespace is discarded (with successful
349*0e209d39SAndroid Build Coastguard Worker      * parse), while trailing whitespace is left as is.
350*0e209d39SAndroid Build Coastguard Worker      * <P>
351*0e209d39SAndroid Build Coastguard Worker      * See Format::parseObject() for more.
352*0e209d39SAndroid Build Coastguard Worker      *
353*0e209d39SAndroid Build Coastguard Worker      * @param source    The string to be parsed into an object.
354*0e209d39SAndroid Build Coastguard Worker      * @param result    Formattable to be set to the parse result.
355*0e209d39SAndroid Build Coastguard Worker      *                  If parse fails, return contents are undefined.
356*0e209d39SAndroid Build Coastguard Worker      * @param parse_pos The position to start parsing at. Upon return
357*0e209d39SAndroid Build Coastguard Worker      *                  this param is set to the position after the
358*0e209d39SAndroid Build Coastguard Worker      *                  last character successfully parsed. If the
359*0e209d39SAndroid Build Coastguard Worker      *                  source is not parsed successfully, this param
360*0e209d39SAndroid Build Coastguard Worker      *                  will remain unchanged.
361*0e209d39SAndroid Build Coastguard Worker      * @return          A newly created Formattable* object, or nullptr
362*0e209d39SAndroid Build Coastguard Worker      *                  on failure.  The caller owns this and should
363*0e209d39SAndroid Build Coastguard Worker      *                  delete it when done.
364*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
365*0e209d39SAndroid Build Coastguard Worker      */
366*0e209d39SAndroid Build Coastguard Worker     virtual void parseObject(const UnicodeString& source,
367*0e209d39SAndroid Build Coastguard Worker                              Formattable& result,
368*0e209d39SAndroid Build Coastguard Worker                              ParsePosition& parse_pos) const override;
369*0e209d39SAndroid Build Coastguard Worker 
370*0e209d39SAndroid Build Coastguard Worker     /**
371*0e209d39SAndroid Build Coastguard Worker      * Format a double number. These methods call the NumberFormat
372*0e209d39SAndroid Build Coastguard Worker      * pure virtual format() methods with the default FieldPosition.
373*0e209d39SAndroid Build Coastguard Worker      *
374*0e209d39SAndroid Build Coastguard Worker      * @param number    The value to be formatted.
375*0e209d39SAndroid Build Coastguard Worker      * @param appendTo  Output parameter to receive result.
376*0e209d39SAndroid Build Coastguard Worker      *                  Result is appended to existing contents.
377*0e209d39SAndroid Build Coastguard Worker      * @return          Reference to 'appendTo' parameter.
378*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
379*0e209d39SAndroid Build Coastguard Worker      */
380*0e209d39SAndroid Build Coastguard Worker     UnicodeString& format(  double number,
381*0e209d39SAndroid Build Coastguard Worker                             UnicodeString& appendTo) const;
382*0e209d39SAndroid Build Coastguard Worker 
383*0e209d39SAndroid Build Coastguard Worker     /**
384*0e209d39SAndroid Build Coastguard Worker      * Format a long number. These methods call the NumberFormat
385*0e209d39SAndroid Build Coastguard Worker      * pure virtual format() methods with the default FieldPosition.
386*0e209d39SAndroid Build Coastguard Worker      *
387*0e209d39SAndroid Build Coastguard Worker      * @param number    The value to be formatted.
388*0e209d39SAndroid Build Coastguard Worker      * @param appendTo  Output parameter to receive result.
389*0e209d39SAndroid Build Coastguard Worker      *                  Result is appended to existing contents.
390*0e209d39SAndroid Build Coastguard Worker      * @return          Reference to 'appendTo' parameter.
391*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
392*0e209d39SAndroid Build Coastguard Worker      */
393*0e209d39SAndroid Build Coastguard Worker     UnicodeString& format(  int32_t number,
394*0e209d39SAndroid Build Coastguard Worker                             UnicodeString& appendTo) const;
395*0e209d39SAndroid Build Coastguard Worker 
396*0e209d39SAndroid Build Coastguard Worker     /**
397*0e209d39SAndroid Build Coastguard Worker      * Format an int64 number. These methods call the NumberFormat
398*0e209d39SAndroid Build Coastguard Worker      * pure virtual format() methods with the default FieldPosition.
399*0e209d39SAndroid Build Coastguard Worker      *
400*0e209d39SAndroid Build Coastguard Worker      * @param number    The value to be formatted.
401*0e209d39SAndroid Build Coastguard Worker      * @param appendTo  Output parameter to receive result.
402*0e209d39SAndroid Build Coastguard Worker      *                  Result is appended to existing contents.
403*0e209d39SAndroid Build Coastguard Worker      * @return          Reference to 'appendTo' parameter.
404*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.8
405*0e209d39SAndroid Build Coastguard Worker      */
406*0e209d39SAndroid Build Coastguard Worker     UnicodeString& format(  int64_t number,
407*0e209d39SAndroid Build Coastguard Worker                             UnicodeString& appendTo) const;
408*0e209d39SAndroid Build Coastguard Worker 
409*0e209d39SAndroid Build Coastguard Worker     /**
410*0e209d39SAndroid Build Coastguard Worker      * Format a double number. Concrete subclasses must implement
411*0e209d39SAndroid Build Coastguard Worker      * these pure virtual methods.
412*0e209d39SAndroid Build Coastguard Worker      *
413*0e209d39SAndroid Build Coastguard Worker      * @param number    The value to be formatted.
414*0e209d39SAndroid Build Coastguard Worker      * @param appendTo  Output parameter to receive result.
415*0e209d39SAndroid Build Coastguard Worker      *                  Result is appended to existing contents.
416*0e209d39SAndroid Build Coastguard Worker      * @param pos       On input: an alignment field, if desired.
417*0e209d39SAndroid Build Coastguard Worker      *                  On output: the offsets of the alignment field.
418*0e209d39SAndroid Build Coastguard Worker      * @return          Reference to 'appendTo' parameter.
419*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
420*0e209d39SAndroid Build Coastguard Worker      */
421*0e209d39SAndroid Build Coastguard Worker     virtual UnicodeString& format(double number,
422*0e209d39SAndroid Build Coastguard Worker                                   UnicodeString& appendTo,
423*0e209d39SAndroid Build Coastguard Worker                                   FieldPosition& pos) const = 0;
424*0e209d39SAndroid Build Coastguard Worker     /**
425*0e209d39SAndroid Build Coastguard Worker      * Format a double number. By default, the parent function simply
426*0e209d39SAndroid Build Coastguard Worker      * calls the base class and does not return an error status.
427*0e209d39SAndroid Build Coastguard Worker      * Therefore, the status may be ignored in some subclasses.
428*0e209d39SAndroid Build Coastguard Worker      *
429*0e209d39SAndroid Build Coastguard Worker      * @param number    The value to be formatted.
430*0e209d39SAndroid Build Coastguard Worker      * @param appendTo  Output parameter to receive result.
431*0e209d39SAndroid Build Coastguard Worker      *                  Result is appended to existing contents.
432*0e209d39SAndroid Build Coastguard Worker      * @param pos       On input: an alignment field, if desired.
433*0e209d39SAndroid Build Coastguard Worker      *                  On output: the offsets of the alignment field.
434*0e209d39SAndroid Build Coastguard Worker      * @param status    error status
435*0e209d39SAndroid Build Coastguard Worker      * @return          Reference to 'appendTo' parameter.
436*0e209d39SAndroid Build Coastguard Worker      * @internal
437*0e209d39SAndroid Build Coastguard Worker      */
438*0e209d39SAndroid Build Coastguard Worker     virtual UnicodeString& format(double number,
439*0e209d39SAndroid Build Coastguard Worker                                   UnicodeString& appendTo,
440*0e209d39SAndroid Build Coastguard Worker                                   FieldPosition& pos,
441*0e209d39SAndroid Build Coastguard Worker                                   UErrorCode &status) const;
442*0e209d39SAndroid Build Coastguard Worker     /**
443*0e209d39SAndroid Build Coastguard Worker      * Format a double number. Subclasses must implement
444*0e209d39SAndroid Build Coastguard Worker      * this method.
445*0e209d39SAndroid Build Coastguard Worker      *
446*0e209d39SAndroid Build Coastguard Worker      * @param number    The value to be formatted.
447*0e209d39SAndroid Build Coastguard Worker      * @param appendTo  Output parameter to receive result.
448*0e209d39SAndroid Build Coastguard Worker      *                  Result is appended to existing contents.
449*0e209d39SAndroid Build Coastguard Worker      * @param posIter   On return, can be used to iterate over positions
450*0e209d39SAndroid Build Coastguard Worker      *                  of fields generated by this format call.
451*0e209d39SAndroid Build Coastguard Worker      *                  Can be nullptr.
452*0e209d39SAndroid Build Coastguard Worker      * @param status    Output param filled with success/failure status.
453*0e209d39SAndroid Build Coastguard Worker      * @return          Reference to 'appendTo' parameter.
454*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 4.4
455*0e209d39SAndroid Build Coastguard Worker      */
456*0e209d39SAndroid Build Coastguard Worker     virtual UnicodeString& format(double number,
457*0e209d39SAndroid Build Coastguard Worker                                   UnicodeString& appendTo,
458*0e209d39SAndroid Build Coastguard Worker                                   FieldPositionIterator* posIter,
459*0e209d39SAndroid Build Coastguard Worker                                   UErrorCode& status) const;
460*0e209d39SAndroid Build Coastguard Worker     /**
461*0e209d39SAndroid Build Coastguard Worker      * Format a long number. Concrete subclasses must implement
462*0e209d39SAndroid Build Coastguard Worker      * these pure virtual methods.
463*0e209d39SAndroid Build Coastguard Worker      *
464*0e209d39SAndroid Build Coastguard Worker      * @param number    The value to be formatted.
465*0e209d39SAndroid Build Coastguard Worker      * @param appendTo  Output parameter to receive result.
466*0e209d39SAndroid Build Coastguard Worker      *                  Result is appended to existing contents.
467*0e209d39SAndroid Build Coastguard Worker      * @param pos       On input: an alignment field, if desired.
468*0e209d39SAndroid Build Coastguard Worker      *                  On output: the offsets of the alignment field.
469*0e209d39SAndroid Build Coastguard Worker      * @return          Reference to 'appendTo' parameter.
470*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
471*0e209d39SAndroid Build Coastguard Worker     */
472*0e209d39SAndroid Build Coastguard Worker     virtual UnicodeString& format(int32_t number,
473*0e209d39SAndroid Build Coastguard Worker                                   UnicodeString& appendTo,
474*0e209d39SAndroid Build Coastguard Worker                                   FieldPosition& pos) const = 0;
475*0e209d39SAndroid Build Coastguard Worker 
476*0e209d39SAndroid Build Coastguard Worker     /**
477*0e209d39SAndroid Build Coastguard Worker      * Format a long number. Concrete subclasses may override
478*0e209d39SAndroid Build Coastguard Worker      * this function to provide status return.
479*0e209d39SAndroid Build Coastguard Worker      *
480*0e209d39SAndroid Build Coastguard Worker      * @param number    The value to be formatted.
481*0e209d39SAndroid Build Coastguard Worker      * @param appendTo  Output parameter to receive result.
482*0e209d39SAndroid Build Coastguard Worker      *                  Result is appended to existing contents.
483*0e209d39SAndroid Build Coastguard Worker      * @param pos       On input: an alignment field, if desired.
484*0e209d39SAndroid Build Coastguard Worker      *                  On output: the offsets of the alignment field.
485*0e209d39SAndroid Build Coastguard Worker      * @param status the output status.
486*0e209d39SAndroid Build Coastguard Worker      * @return          Reference to 'appendTo' parameter.
487*0e209d39SAndroid Build Coastguard Worker      * @internal
488*0e209d39SAndroid Build Coastguard Worker     */
489*0e209d39SAndroid Build Coastguard Worker     virtual UnicodeString& format(int32_t number,
490*0e209d39SAndroid Build Coastguard Worker                                   UnicodeString& appendTo,
491*0e209d39SAndroid Build Coastguard Worker                                   FieldPosition& pos,
492*0e209d39SAndroid Build Coastguard Worker                                   UErrorCode &status) const;
493*0e209d39SAndroid Build Coastguard Worker 
494*0e209d39SAndroid Build Coastguard Worker     /**
495*0e209d39SAndroid Build Coastguard Worker      * Format an int32 number. Subclasses must implement
496*0e209d39SAndroid Build Coastguard Worker      * this method.
497*0e209d39SAndroid Build Coastguard Worker      *
498*0e209d39SAndroid Build Coastguard Worker      * @param number    The value to be formatted.
499*0e209d39SAndroid Build Coastguard Worker      * @param appendTo  Output parameter to receive result.
500*0e209d39SAndroid Build Coastguard Worker      *                  Result is appended to existing contents.
501*0e209d39SAndroid Build Coastguard Worker      * @param posIter   On return, can be used to iterate over positions
502*0e209d39SAndroid Build Coastguard Worker      *                  of fields generated by this format call.
503*0e209d39SAndroid Build Coastguard Worker      *                  Can be nullptr.
504*0e209d39SAndroid Build Coastguard Worker      * @param status    Output param filled with success/failure status.
505*0e209d39SAndroid Build Coastguard Worker      * @return          Reference to 'appendTo' parameter.
506*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 4.4
507*0e209d39SAndroid Build Coastguard Worker      */
508*0e209d39SAndroid Build Coastguard Worker     virtual UnicodeString& format(int32_t number,
509*0e209d39SAndroid Build Coastguard Worker                                   UnicodeString& appendTo,
510*0e209d39SAndroid Build Coastguard Worker                                   FieldPositionIterator* posIter,
511*0e209d39SAndroid Build Coastguard Worker                                   UErrorCode& status) const;
512*0e209d39SAndroid Build Coastguard Worker     /**
513*0e209d39SAndroid Build Coastguard Worker      * Format an int64 number. (Not abstract to retain compatibility
514*0e209d39SAndroid Build Coastguard Worker      * with earlier releases, however subclasses should override this
515*0e209d39SAndroid Build Coastguard Worker      * method as it just delegates to format(int32_t number...);
516*0e209d39SAndroid Build Coastguard Worker      *
517*0e209d39SAndroid Build Coastguard Worker      * @param number    The value to be formatted.
518*0e209d39SAndroid Build Coastguard Worker      * @param appendTo  Output parameter to receive result.
519*0e209d39SAndroid Build Coastguard Worker      *                  Result is appended to existing contents.
520*0e209d39SAndroid Build Coastguard Worker      * @param pos       On input: an alignment field, if desired.
521*0e209d39SAndroid Build Coastguard Worker      *                  On output: the offsets of the alignment field.
522*0e209d39SAndroid Build Coastguard Worker      * @return          Reference to 'appendTo' parameter.
523*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.8
524*0e209d39SAndroid Build Coastguard Worker     */
525*0e209d39SAndroid Build Coastguard Worker     virtual UnicodeString& format(int64_t number,
526*0e209d39SAndroid Build Coastguard Worker                                   UnicodeString& appendTo,
527*0e209d39SAndroid Build Coastguard Worker                                   FieldPosition& pos) const;
528*0e209d39SAndroid Build Coastguard Worker 
529*0e209d39SAndroid Build Coastguard Worker     /**
530*0e209d39SAndroid Build Coastguard Worker      * Format an int64 number. (Not abstract to retain compatibility
531*0e209d39SAndroid Build Coastguard Worker      * with earlier releases, however subclasses should override this
532*0e209d39SAndroid Build Coastguard Worker      * method as it just delegates to format(int32_t number...);
533*0e209d39SAndroid Build Coastguard Worker      *
534*0e209d39SAndroid Build Coastguard Worker      * @param number    The value to be formatted.
535*0e209d39SAndroid Build Coastguard Worker      * @param appendTo  Output parameter to receive result.
536*0e209d39SAndroid Build Coastguard Worker      *                  Result is appended to existing contents.
537*0e209d39SAndroid Build Coastguard Worker      * @param pos       On input: an alignment field, if desired.
538*0e209d39SAndroid Build Coastguard Worker      *                  On output: the offsets of the alignment field.
539*0e209d39SAndroid Build Coastguard Worker      * @param status    Output param filled with success/failure status.
540*0e209d39SAndroid Build Coastguard Worker      * @return          Reference to 'appendTo' parameter.
541*0e209d39SAndroid Build Coastguard Worker      * @internal
542*0e209d39SAndroid Build Coastguard Worker     */
543*0e209d39SAndroid Build Coastguard Worker     virtual UnicodeString& format(int64_t number,
544*0e209d39SAndroid Build Coastguard Worker                                   UnicodeString& appendTo,
545*0e209d39SAndroid Build Coastguard Worker                                   FieldPosition& pos,
546*0e209d39SAndroid Build Coastguard Worker                                   UErrorCode& status) const;
547*0e209d39SAndroid Build Coastguard Worker     /**
548*0e209d39SAndroid Build Coastguard Worker      * Format an int64 number. Subclasses must implement
549*0e209d39SAndroid Build Coastguard Worker      * this method.
550*0e209d39SAndroid Build Coastguard Worker      *
551*0e209d39SAndroid Build Coastguard Worker      * @param number    The value to be formatted.
552*0e209d39SAndroid Build Coastguard Worker      * @param appendTo  Output parameter to receive result.
553*0e209d39SAndroid Build Coastguard Worker      *                  Result is appended to existing contents.
554*0e209d39SAndroid Build Coastguard Worker      * @param posIter   On return, can be used to iterate over positions
555*0e209d39SAndroid Build Coastguard Worker      *                  of fields generated by this format call.
556*0e209d39SAndroid Build Coastguard Worker      *                  Can be nullptr.
557*0e209d39SAndroid Build Coastguard Worker      * @param status    Output param filled with success/failure status.
558*0e209d39SAndroid Build Coastguard Worker      * @return          Reference to 'appendTo' parameter.
559*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 4.4
560*0e209d39SAndroid Build Coastguard Worker      */
561*0e209d39SAndroid Build Coastguard Worker     virtual UnicodeString& format(int64_t number,
562*0e209d39SAndroid Build Coastguard Worker                                   UnicodeString& appendTo,
563*0e209d39SAndroid Build Coastguard Worker                                   FieldPositionIterator* posIter,
564*0e209d39SAndroid Build Coastguard Worker                                   UErrorCode& status) const;
565*0e209d39SAndroid Build Coastguard Worker 
566*0e209d39SAndroid Build Coastguard Worker     /**
567*0e209d39SAndroid Build Coastguard Worker      * Format a decimal number. Subclasses must implement
568*0e209d39SAndroid Build Coastguard Worker      * this method.  The syntax of the unformatted number is a "numeric string"
569*0e209d39SAndroid Build Coastguard Worker      * as defined in the Decimal Arithmetic Specification, available at
570*0e209d39SAndroid Build Coastguard Worker      * http://speleotrove.com/decimal
571*0e209d39SAndroid Build Coastguard Worker      *
572*0e209d39SAndroid Build Coastguard Worker      * @param number    The unformatted number, as a string, to be formatted.
573*0e209d39SAndroid Build Coastguard Worker      * @param appendTo  Output parameter to receive result.
574*0e209d39SAndroid Build Coastguard Worker      *                  Result is appended to existing contents.
575*0e209d39SAndroid Build Coastguard Worker      * @param posIter   On return, can be used to iterate over positions
576*0e209d39SAndroid Build Coastguard Worker      *                  of fields generated by this format call.
577*0e209d39SAndroid Build Coastguard Worker      *                  Can be nullptr.
578*0e209d39SAndroid Build Coastguard Worker      * @param status    Output param filled with success/failure status.
579*0e209d39SAndroid Build Coastguard Worker      * @return          Reference to 'appendTo' parameter.
580*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 4.4
581*0e209d39SAndroid Build Coastguard Worker      */
582*0e209d39SAndroid Build Coastguard Worker     virtual UnicodeString& format(StringPiece number,
583*0e209d39SAndroid Build Coastguard Worker                                   UnicodeString& appendTo,
584*0e209d39SAndroid Build Coastguard Worker                                   FieldPositionIterator* posIter,
585*0e209d39SAndroid Build Coastguard Worker                                   UErrorCode& status) const;
586*0e209d39SAndroid Build Coastguard Worker 
587*0e209d39SAndroid Build Coastguard Worker // Can't use #ifndef U_HIDE_INTERNAL_API because these are virtual methods
588*0e209d39SAndroid Build Coastguard Worker 
589*0e209d39SAndroid Build Coastguard Worker     /**
590*0e209d39SAndroid Build Coastguard Worker      * Format a decimal number.
591*0e209d39SAndroid Build Coastguard Worker      * The number is a DecimalQuantity wrapper onto a floating point decimal number.
592*0e209d39SAndroid Build Coastguard Worker      * The default implementation in NumberFormat converts the decimal number
593*0e209d39SAndroid Build Coastguard Worker      * to a double and formats that.  Subclasses of NumberFormat that want
594*0e209d39SAndroid Build Coastguard Worker      * to specifically handle big decimal numbers must override this method.
595*0e209d39SAndroid Build Coastguard Worker      * class DecimalFormat does so.
596*0e209d39SAndroid Build Coastguard Worker      *
597*0e209d39SAndroid Build Coastguard Worker      * @param number    The number, a DecimalQuantity format Decimal Floating Point.
598*0e209d39SAndroid Build Coastguard Worker      * @param appendTo  Output parameter to receive result.
599*0e209d39SAndroid Build Coastguard Worker      *                  Result is appended to existing contents.
600*0e209d39SAndroid Build Coastguard Worker      * @param posIter   On return, can be used to iterate over positions
601*0e209d39SAndroid Build Coastguard Worker      *                  of fields generated by this format call.
602*0e209d39SAndroid Build Coastguard Worker      * @param status    Output param filled with success/failure status.
603*0e209d39SAndroid Build Coastguard Worker      * @return          Reference to 'appendTo' parameter.
604*0e209d39SAndroid Build Coastguard Worker      * @internal
605*0e209d39SAndroid Build Coastguard Worker      */
606*0e209d39SAndroid Build Coastguard Worker     virtual UnicodeString& format(const number::impl::DecimalQuantity &number,
607*0e209d39SAndroid Build Coastguard Worker                                   UnicodeString& appendTo,
608*0e209d39SAndroid Build Coastguard Worker                                   FieldPositionIterator* posIter,
609*0e209d39SAndroid Build Coastguard Worker                                   UErrorCode& status) const;
610*0e209d39SAndroid Build Coastguard Worker 
611*0e209d39SAndroid Build Coastguard Worker     /**
612*0e209d39SAndroid Build Coastguard Worker      * Format a decimal number.
613*0e209d39SAndroid Build Coastguard Worker      * The number is a DecimalQuantity wrapper onto a floating point decimal number.
614*0e209d39SAndroid Build Coastguard Worker      * The default implementation in NumberFormat converts the decimal number
615*0e209d39SAndroid Build Coastguard Worker      * to a double and formats that.  Subclasses of NumberFormat that want
616*0e209d39SAndroid Build Coastguard Worker      * to specifically handle big decimal numbers must override this method.
617*0e209d39SAndroid Build Coastguard Worker      * class DecimalFormat does so.
618*0e209d39SAndroid Build Coastguard Worker      *
619*0e209d39SAndroid Build Coastguard Worker      * @param number    The number, a DecimalQuantity format Decimal Floating Point.
620*0e209d39SAndroid Build Coastguard Worker      * @param appendTo  Output parameter to receive result.
621*0e209d39SAndroid Build Coastguard Worker      *                  Result is appended to existing contents.
622*0e209d39SAndroid Build Coastguard Worker      * @param pos       On input: an alignment field, if desired.
623*0e209d39SAndroid Build Coastguard Worker      *                  On output: the offsets of the alignment field.
624*0e209d39SAndroid Build Coastguard Worker      * @param status    Output param filled with success/failure status.
625*0e209d39SAndroid Build Coastguard Worker      * @return          Reference to 'appendTo' parameter.
626*0e209d39SAndroid Build Coastguard Worker      * @internal
627*0e209d39SAndroid Build Coastguard Worker      */
628*0e209d39SAndroid Build Coastguard Worker     virtual UnicodeString& format(const number::impl::DecimalQuantity &number,
629*0e209d39SAndroid Build Coastguard Worker                                   UnicodeString& appendTo,
630*0e209d39SAndroid Build Coastguard Worker                                   FieldPosition& pos,
631*0e209d39SAndroid Build Coastguard Worker                                   UErrorCode& status) const;
632*0e209d39SAndroid Build Coastguard Worker 
633*0e209d39SAndroid Build Coastguard Worker    /**
634*0e209d39SAndroid Build Coastguard Worker     * Return a long if possible (e.g. within range LONG_MAX,
635*0e209d39SAndroid Build Coastguard Worker     * LONG_MAX], and with no decimals), otherwise a double.  If
636*0e209d39SAndroid Build Coastguard Worker     * IntegerOnly is set, will stop at a decimal point (or equivalent;
637*0e209d39SAndroid Build Coastguard Worker     * e.g. for rational numbers "1 2/3", will stop after the 1).
638*0e209d39SAndroid Build Coastguard Worker     * <P>
639*0e209d39SAndroid Build Coastguard Worker     * If no object can be parsed, index is unchanged, and nullptr is
640*0e209d39SAndroid Build Coastguard Worker     * returned.
641*0e209d39SAndroid Build Coastguard Worker     * <P>
642*0e209d39SAndroid Build Coastguard Worker     * This is a pure virtual which concrete subclasses must implement.
643*0e209d39SAndroid Build Coastguard Worker     *
644*0e209d39SAndroid Build Coastguard Worker     * @param text           The text to be parsed.
645*0e209d39SAndroid Build Coastguard Worker     * @param result         Formattable to be set to the parse result.
646*0e209d39SAndroid Build Coastguard Worker     *                       If parse fails, return contents are undefined.
647*0e209d39SAndroid Build Coastguard Worker     * @param parsePosition  The position to start parsing at on input.
648*0e209d39SAndroid Build Coastguard Worker     *                       On output, moved to after the last successfully
649*0e209d39SAndroid Build Coastguard Worker     *                       parse character. On parse failure, does not change.
650*0e209d39SAndroid Build Coastguard Worker     * @stable ICU 2.0
651*0e209d39SAndroid Build Coastguard Worker     */
652*0e209d39SAndroid Build Coastguard Worker     virtual void parse(const UnicodeString& text,
653*0e209d39SAndroid Build Coastguard Worker                        Formattable& result,
654*0e209d39SAndroid Build Coastguard Worker                        ParsePosition& parsePosition) const = 0;
655*0e209d39SAndroid Build Coastguard Worker 
656*0e209d39SAndroid Build Coastguard Worker     /**
657*0e209d39SAndroid Build Coastguard Worker      * Parse a string as a numeric value, and return a Formattable
658*0e209d39SAndroid Build Coastguard Worker      * numeric object. This method parses integers only if IntegerOnly
659*0e209d39SAndroid Build Coastguard Worker      * is set.
660*0e209d39SAndroid Build Coastguard Worker      *
661*0e209d39SAndroid Build Coastguard Worker      * @param text          The text to be parsed.
662*0e209d39SAndroid Build Coastguard Worker      * @param result        Formattable to be set to the parse result.
663*0e209d39SAndroid Build Coastguard Worker      *                      If parse fails, return contents are undefined.
664*0e209d39SAndroid Build Coastguard Worker      * @param status        Output parameter set to a failure error code
665*0e209d39SAndroid Build Coastguard Worker      *                      when a failure occurs. The error code when the
666*0e209d39SAndroid Build Coastguard Worker      *                      string fails to parse is U_INVALID_FORMAT_ERROR,
667*0e209d39SAndroid Build Coastguard Worker      *                      unless overridden by a subclass.
668*0e209d39SAndroid Build Coastguard Worker      * @see                 NumberFormat::isParseIntegerOnly
669*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
670*0e209d39SAndroid Build Coastguard Worker      */
671*0e209d39SAndroid Build Coastguard Worker     virtual void parse(const UnicodeString& text,
672*0e209d39SAndroid Build Coastguard Worker                        Formattable& result,
673*0e209d39SAndroid Build Coastguard Worker                        UErrorCode& status) const;
674*0e209d39SAndroid Build Coastguard Worker 
675*0e209d39SAndroid Build Coastguard Worker     /**
676*0e209d39SAndroid Build Coastguard Worker      * Parses text from the given string as a currency amount.  Unlike
677*0e209d39SAndroid Build Coastguard Worker      * the parse() method, this method will attempt to parse a generic
678*0e209d39SAndroid Build Coastguard Worker      * currency name, searching for a match of this object's locale's
679*0e209d39SAndroid Build Coastguard Worker      * currency display names, or for a 3-letter ISO currency code.
680*0e209d39SAndroid Build Coastguard Worker      * This method will fail if this format is not a currency format,
681*0e209d39SAndroid Build Coastguard Worker      * that is, if it does not contain the currency pattern symbol
682*0e209d39SAndroid Build Coastguard Worker      * (U+00A4) in its prefix or suffix.
683*0e209d39SAndroid Build Coastguard Worker      *
684*0e209d39SAndroid Build Coastguard Worker      * @param text the string to parse
685*0e209d39SAndroid Build Coastguard Worker      * @param pos  input-output position; on input, the position within text
686*0e209d39SAndroid Build Coastguard Worker      *             to match; must have 0 <= pos.getIndex() < text.length();
687*0e209d39SAndroid Build Coastguard Worker      *             on output, the position after the last matched character.
688*0e209d39SAndroid Build Coastguard Worker      *             If the parse fails, the position in unchanged upon output.
689*0e209d39SAndroid Build Coastguard Worker      * @return     if parse succeeds, a pointer to a newly-created CurrencyAmount
690*0e209d39SAndroid Build Coastguard Worker      *             object (owned by the caller) containing information about
691*0e209d39SAndroid Build Coastguard Worker      *             the parsed currency; if parse fails, this is nullptr.
692*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 49
693*0e209d39SAndroid Build Coastguard Worker      */
694*0e209d39SAndroid Build Coastguard Worker     virtual CurrencyAmount* parseCurrency(const UnicodeString& text,
695*0e209d39SAndroid Build Coastguard Worker                                           ParsePosition& pos) const;
696*0e209d39SAndroid Build Coastguard Worker 
697*0e209d39SAndroid Build Coastguard Worker     /**
698*0e209d39SAndroid Build Coastguard Worker      * Return true if this format will parse numbers as integers
699*0e209d39SAndroid Build Coastguard Worker      * only.  For example in the English locale, with ParseIntegerOnly
700*0e209d39SAndroid Build Coastguard Worker      * true, the string "1234." would be parsed as the integer value
701*0e209d39SAndroid Build Coastguard Worker      * 1234 and parsing would stop at the "." character.  Of course,
702*0e209d39SAndroid Build Coastguard Worker      * the exact format accepted by the parse operation is locale
703*0e209d39SAndroid Build Coastguard Worker      * dependent and determined by sub-classes of NumberFormat.
704*0e209d39SAndroid Build Coastguard Worker      * @return    true if this format will parse numbers as integers
705*0e209d39SAndroid Build Coastguard Worker      *            only.
706*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
707*0e209d39SAndroid Build Coastguard Worker      */
708*0e209d39SAndroid Build Coastguard Worker     UBool isParseIntegerOnly() const;
709*0e209d39SAndroid Build Coastguard Worker 
710*0e209d39SAndroid Build Coastguard Worker     /**
711*0e209d39SAndroid Build Coastguard Worker      * Sets whether or not numbers should be parsed as integers only.
712*0e209d39SAndroid Build Coastguard Worker      * @param value    set True, this format will parse numbers as integers
713*0e209d39SAndroid Build Coastguard Worker      *                 only.
714*0e209d39SAndroid Build Coastguard Worker      * @see isParseIntegerOnly
715*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
716*0e209d39SAndroid Build Coastguard Worker      */
717*0e209d39SAndroid Build Coastguard Worker     virtual void setParseIntegerOnly(UBool value);
718*0e209d39SAndroid Build Coastguard Worker 
719*0e209d39SAndroid Build Coastguard Worker     /**
720*0e209d39SAndroid Build Coastguard Worker      * Sets whether lenient parsing should be enabled (it is off by default).
721*0e209d39SAndroid Build Coastguard Worker      *
722*0e209d39SAndroid Build Coastguard Worker      * @param enable \c true if lenient parsing should be used,
723*0e209d39SAndroid Build Coastguard Worker      *               \c false otherwise.
724*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 4.8
725*0e209d39SAndroid Build Coastguard Worker      */
726*0e209d39SAndroid Build Coastguard Worker     virtual void setLenient(UBool enable);
727*0e209d39SAndroid Build Coastguard Worker 
728*0e209d39SAndroid Build Coastguard Worker     /**
729*0e209d39SAndroid Build Coastguard Worker      * Returns whether lenient parsing is enabled (it is off by default).
730*0e209d39SAndroid Build Coastguard Worker      *
731*0e209d39SAndroid Build Coastguard Worker      * @return \c true if lenient parsing is enabled,
732*0e209d39SAndroid Build Coastguard Worker      *         \c false otherwise.
733*0e209d39SAndroid Build Coastguard Worker      * @see #setLenient
734*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 4.8
735*0e209d39SAndroid Build Coastguard Worker      */
736*0e209d39SAndroid Build Coastguard Worker     virtual UBool isLenient() const;
737*0e209d39SAndroid Build Coastguard Worker 
738*0e209d39SAndroid Build Coastguard Worker     /**
739*0e209d39SAndroid Build Coastguard Worker      * Create a default style NumberFormat for the current default locale.
740*0e209d39SAndroid Build Coastguard Worker      * The default formatting style is locale dependent.
741*0e209d39SAndroid Build Coastguard Worker      * <p>
742*0e209d39SAndroid Build Coastguard Worker      * <strong>NOTE:</strong> New users are strongly encouraged to use
743*0e209d39SAndroid Build Coastguard Worker      * {@link icu::number::NumberFormatter} instead of NumberFormat.
744*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
745*0e209d39SAndroid Build Coastguard Worker      */
746*0e209d39SAndroid Build Coastguard Worker     static NumberFormat* U_EXPORT2 createInstance(UErrorCode&);
747*0e209d39SAndroid Build Coastguard Worker 
748*0e209d39SAndroid Build Coastguard Worker     /**
749*0e209d39SAndroid Build Coastguard Worker      * Create a default style NumberFormat for the specified locale.
750*0e209d39SAndroid Build Coastguard Worker      * The default formatting style is locale dependent.
751*0e209d39SAndroid Build Coastguard Worker      * @param inLocale    the given locale.
752*0e209d39SAndroid Build Coastguard Worker      * <p>
753*0e209d39SAndroid Build Coastguard Worker      * <strong>NOTE:</strong> New users are strongly encouraged to use
754*0e209d39SAndroid Build Coastguard Worker      * {@link icu::number::NumberFormatter} instead of NumberFormat.
755*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
756*0e209d39SAndroid Build Coastguard Worker      */
757*0e209d39SAndroid Build Coastguard Worker     static NumberFormat* U_EXPORT2 createInstance(const Locale& inLocale,
758*0e209d39SAndroid Build Coastguard Worker                                         UErrorCode&);
759*0e209d39SAndroid Build Coastguard Worker 
760*0e209d39SAndroid Build Coastguard Worker     /**
761*0e209d39SAndroid Build Coastguard Worker      * Create a specific style NumberFormat for the specified locale.
762*0e209d39SAndroid Build Coastguard Worker      * <p>
763*0e209d39SAndroid Build Coastguard Worker      * <strong>NOTE:</strong> New users are strongly encouraged to use
764*0e209d39SAndroid Build Coastguard Worker      * {@link icu::number::NumberFormatter} instead of NumberFormat.
765*0e209d39SAndroid Build Coastguard Worker      * @param desiredLocale    the given locale.
766*0e209d39SAndroid Build Coastguard Worker      * @param style            the given style.
767*0e209d39SAndroid Build Coastguard Worker      * @param errorCode        Output param filled with success/failure status.
768*0e209d39SAndroid Build Coastguard Worker      * @return                 A new NumberFormat instance.
769*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 4.8
770*0e209d39SAndroid Build Coastguard Worker      */
771*0e209d39SAndroid Build Coastguard Worker     static NumberFormat* U_EXPORT2 createInstance(const Locale& desiredLocale,
772*0e209d39SAndroid Build Coastguard Worker                                                   UNumberFormatStyle style,
773*0e209d39SAndroid Build Coastguard Worker                                                   UErrorCode& errorCode);
774*0e209d39SAndroid Build Coastguard Worker 
775*0e209d39SAndroid Build Coastguard Worker #ifndef U_HIDE_INTERNAL_API
776*0e209d39SAndroid Build Coastguard Worker 
777*0e209d39SAndroid Build Coastguard Worker     /**
778*0e209d39SAndroid Build Coastguard Worker      * ICU use only.
779*0e209d39SAndroid Build Coastguard Worker      * Creates NumberFormat instance without using the cache.
780*0e209d39SAndroid Build Coastguard Worker      * @internal
781*0e209d39SAndroid Build Coastguard Worker      */
782*0e209d39SAndroid Build Coastguard Worker     static NumberFormat* internalCreateInstance(
783*0e209d39SAndroid Build Coastguard Worker             const Locale& desiredLocale,
784*0e209d39SAndroid Build Coastguard Worker             UNumberFormatStyle style,
785*0e209d39SAndroid Build Coastguard Worker             UErrorCode& errorCode);
786*0e209d39SAndroid Build Coastguard Worker 
787*0e209d39SAndroid Build Coastguard Worker     /**
788*0e209d39SAndroid Build Coastguard Worker      * ICU use only.
789*0e209d39SAndroid Build Coastguard Worker      * Returns handle to the shared, cached NumberFormat instance for given
790*0e209d39SAndroid Build Coastguard Worker      * locale. On success, caller must call removeRef() on returned value
791*0e209d39SAndroid Build Coastguard Worker      * once it is done with the shared instance.
792*0e209d39SAndroid Build Coastguard Worker      * @internal
793*0e209d39SAndroid Build Coastguard Worker      */
794*0e209d39SAndroid Build Coastguard Worker     static const SharedNumberFormat* U_EXPORT2 createSharedInstance(
795*0e209d39SAndroid Build Coastguard Worker             const Locale& inLocale, UNumberFormatStyle style, UErrorCode& status);
796*0e209d39SAndroid Build Coastguard Worker 
797*0e209d39SAndroid Build Coastguard Worker #endif  /* U_HIDE_INTERNAL_API */
798*0e209d39SAndroid Build Coastguard Worker 
799*0e209d39SAndroid Build Coastguard Worker     /**
800*0e209d39SAndroid Build Coastguard Worker      * Returns a currency format for the current default locale.
801*0e209d39SAndroid Build Coastguard Worker      * <p>
802*0e209d39SAndroid Build Coastguard Worker      * <strong>NOTE:</strong> New users are strongly encouraged to use
803*0e209d39SAndroid Build Coastguard Worker      * {@link icu::number::NumberFormatter} instead of NumberFormat.
804*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
805*0e209d39SAndroid Build Coastguard Worker      */
806*0e209d39SAndroid Build Coastguard Worker     static NumberFormat* U_EXPORT2 createCurrencyInstance(UErrorCode&);
807*0e209d39SAndroid Build Coastguard Worker 
808*0e209d39SAndroid Build Coastguard Worker     /**
809*0e209d39SAndroid Build Coastguard Worker      * Returns a currency format for the specified locale.
810*0e209d39SAndroid Build Coastguard Worker      * <p>
811*0e209d39SAndroid Build Coastguard Worker      * <strong>NOTE:</strong> New users are strongly encouraged to use
812*0e209d39SAndroid Build Coastguard Worker      * {@link icu::number::NumberFormatter} instead of NumberFormat.
813*0e209d39SAndroid Build Coastguard Worker      * @param inLocale    the given locale.
814*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
815*0e209d39SAndroid Build Coastguard Worker      */
816*0e209d39SAndroid Build Coastguard Worker     static NumberFormat* U_EXPORT2 createCurrencyInstance(const Locale& inLocale,
817*0e209d39SAndroid Build Coastguard Worker                                                 UErrorCode&);
818*0e209d39SAndroid Build Coastguard Worker 
819*0e209d39SAndroid Build Coastguard Worker     /**
820*0e209d39SAndroid Build Coastguard Worker      * Returns a percentage format for the current default locale.
821*0e209d39SAndroid Build Coastguard Worker      * <p>
822*0e209d39SAndroid Build Coastguard Worker      * <strong>NOTE:</strong> New users are strongly encouraged to use
823*0e209d39SAndroid Build Coastguard Worker      * {@link icu::number::NumberFormatter} instead of NumberFormat.
824*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
825*0e209d39SAndroid Build Coastguard Worker      */
826*0e209d39SAndroid Build Coastguard Worker     static NumberFormat* U_EXPORT2 createPercentInstance(UErrorCode&);
827*0e209d39SAndroid Build Coastguard Worker 
828*0e209d39SAndroid Build Coastguard Worker     /**
829*0e209d39SAndroid Build Coastguard Worker      * Returns a percentage format for the specified locale.
830*0e209d39SAndroid Build Coastguard Worker      * <p>
831*0e209d39SAndroid Build Coastguard Worker      * <strong>NOTE:</strong> New users are strongly encouraged to use
832*0e209d39SAndroid Build Coastguard Worker      * {@link icu::number::NumberFormatter} instead of NumberFormat.
833*0e209d39SAndroid Build Coastguard Worker      * @param inLocale    the given locale.
834*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
835*0e209d39SAndroid Build Coastguard Worker      */
836*0e209d39SAndroid Build Coastguard Worker     static NumberFormat* U_EXPORT2 createPercentInstance(const Locale& inLocale,
837*0e209d39SAndroid Build Coastguard Worker                                                UErrorCode&);
838*0e209d39SAndroid Build Coastguard Worker 
839*0e209d39SAndroid Build Coastguard Worker     /**
840*0e209d39SAndroid Build Coastguard Worker      * Returns a scientific format for the current default locale.
841*0e209d39SAndroid Build Coastguard Worker      * <p>
842*0e209d39SAndroid Build Coastguard Worker      * <strong>NOTE:</strong> New users are strongly encouraged to use
843*0e209d39SAndroid Build Coastguard Worker      * {@link icu::number::NumberFormatter} instead of NumberFormat.
844*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
845*0e209d39SAndroid Build Coastguard Worker      */
846*0e209d39SAndroid Build Coastguard Worker     static NumberFormat* U_EXPORT2 createScientificInstance(UErrorCode&);
847*0e209d39SAndroid Build Coastguard Worker 
848*0e209d39SAndroid Build Coastguard Worker     /**
849*0e209d39SAndroid Build Coastguard Worker      * Returns a scientific format for the specified locale.
850*0e209d39SAndroid Build Coastguard Worker      * <p>
851*0e209d39SAndroid Build Coastguard Worker      * <strong>NOTE:</strong> New users are strongly encouraged to use
852*0e209d39SAndroid Build Coastguard Worker      * {@link icu::number::NumberFormatter} instead of NumberFormat.
853*0e209d39SAndroid Build Coastguard Worker      * @param inLocale    the given locale.
854*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
855*0e209d39SAndroid Build Coastguard Worker      */
856*0e209d39SAndroid Build Coastguard Worker     static NumberFormat* U_EXPORT2 createScientificInstance(const Locale& inLocale,
857*0e209d39SAndroid Build Coastguard Worker                                                 UErrorCode&);
858*0e209d39SAndroid Build Coastguard Worker 
859*0e209d39SAndroid Build Coastguard Worker     /**
860*0e209d39SAndroid Build Coastguard Worker      * Get the set of Locales for which NumberFormats are installed.
861*0e209d39SAndroid Build Coastguard Worker      * @param count    Output param to receive the size of the locales
862*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
863*0e209d39SAndroid Build Coastguard Worker      */
864*0e209d39SAndroid Build Coastguard Worker     static const Locale* U_EXPORT2 getAvailableLocales(int32_t& count);
865*0e209d39SAndroid Build Coastguard Worker 
866*0e209d39SAndroid Build Coastguard Worker #if !UCONFIG_NO_SERVICE
867*0e209d39SAndroid Build Coastguard Worker     /**
868*0e209d39SAndroid Build Coastguard Worker      * Register a new NumberFormatFactory.  The factory will be adopted.
869*0e209d39SAndroid Build Coastguard Worker      * Because ICU may choose to cache NumberFormat objects internally,
870*0e209d39SAndroid Build Coastguard Worker      * this must be called at application startup, prior to any calls to
871*0e209d39SAndroid Build Coastguard Worker      * NumberFormat::createInstance to avoid undefined behavior.
872*0e209d39SAndroid Build Coastguard Worker      * @param toAdopt the NumberFormatFactory instance to be adopted
873*0e209d39SAndroid Build Coastguard Worker      * @param status the in/out status code, no special meanings are assigned
874*0e209d39SAndroid Build Coastguard Worker      * @return a registry key that can be used to unregister this factory
875*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.6
876*0e209d39SAndroid Build Coastguard Worker      */
877*0e209d39SAndroid Build Coastguard Worker     static URegistryKey U_EXPORT2 registerFactory(NumberFormatFactory* toAdopt, UErrorCode& status);
878*0e209d39SAndroid Build Coastguard Worker 
879*0e209d39SAndroid Build Coastguard Worker     /**
880*0e209d39SAndroid Build Coastguard Worker      * Unregister a previously-registered NumberFormatFactory using the key returned from the
881*0e209d39SAndroid Build Coastguard Worker      * register call.  Key becomes invalid after a successful call and should not be used again.
882*0e209d39SAndroid Build Coastguard Worker      * The NumberFormatFactory corresponding to the key will be deleted.
883*0e209d39SAndroid Build Coastguard Worker      * Because ICU may choose to cache NumberFormat objects internally,
884*0e209d39SAndroid Build Coastguard Worker      * this should be called during application shutdown, after all calls to
885*0e209d39SAndroid Build Coastguard Worker      * NumberFormat::createInstance to avoid undefined behavior.
886*0e209d39SAndroid Build Coastguard Worker      * @param key the registry key returned by a previous call to registerFactory
887*0e209d39SAndroid Build Coastguard Worker      * @param status the in/out status code, no special meanings are assigned
888*0e209d39SAndroid Build Coastguard Worker      * @return true if the factory for the key was successfully unregistered
889*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.6
890*0e209d39SAndroid Build Coastguard Worker      */
891*0e209d39SAndroid Build Coastguard Worker     static UBool U_EXPORT2 unregister(URegistryKey key, UErrorCode& status);
892*0e209d39SAndroid Build Coastguard Worker 
893*0e209d39SAndroid Build Coastguard Worker     /**
894*0e209d39SAndroid Build Coastguard Worker      * Return a StringEnumeration over the locales available at the time of the call,
895*0e209d39SAndroid Build Coastguard Worker      * including registered locales.
896*0e209d39SAndroid Build Coastguard Worker      * @return a StringEnumeration over the locales available at the time of the call
897*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.6
898*0e209d39SAndroid Build Coastguard Worker      */
899*0e209d39SAndroid Build Coastguard Worker     static StringEnumeration* U_EXPORT2 getAvailableLocales();
900*0e209d39SAndroid Build Coastguard Worker #endif /* UCONFIG_NO_SERVICE */
901*0e209d39SAndroid Build Coastguard Worker 
902*0e209d39SAndroid Build Coastguard Worker     /**
903*0e209d39SAndroid Build Coastguard Worker      * Returns true if grouping is used in this format. For example,
904*0e209d39SAndroid Build Coastguard Worker      * in the English locale, with grouping on, the number 1234567
905*0e209d39SAndroid Build Coastguard Worker      * might be formatted as "1,234,567". The grouping separator as
906*0e209d39SAndroid Build Coastguard Worker      * well as the size of each group is locale dependent and is
907*0e209d39SAndroid Build Coastguard Worker      * determined by sub-classes of NumberFormat.
908*0e209d39SAndroid Build Coastguard Worker      * @see setGroupingUsed
909*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
910*0e209d39SAndroid Build Coastguard Worker      */
911*0e209d39SAndroid Build Coastguard Worker     UBool isGroupingUsed() const;
912*0e209d39SAndroid Build Coastguard Worker 
913*0e209d39SAndroid Build Coastguard Worker     /**
914*0e209d39SAndroid Build Coastguard Worker      * Set whether or not grouping will be used in this format.
915*0e209d39SAndroid Build Coastguard Worker      * @param newValue    True, grouping will be used in this format.
916*0e209d39SAndroid Build Coastguard Worker      * @see getGroupingUsed
917*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
918*0e209d39SAndroid Build Coastguard Worker      */
919*0e209d39SAndroid Build Coastguard Worker     virtual void setGroupingUsed(UBool newValue);
920*0e209d39SAndroid Build Coastguard Worker 
921*0e209d39SAndroid Build Coastguard Worker     /**
922*0e209d39SAndroid Build Coastguard Worker      * Returns the maximum number of digits allowed in the integer portion of a
923*0e209d39SAndroid Build Coastguard Worker      * number.
924*0e209d39SAndroid Build Coastguard Worker      * @return     the maximum number of digits allowed in the integer portion of a
925*0e209d39SAndroid Build Coastguard Worker      *             number.
926*0e209d39SAndroid Build Coastguard Worker      * @see setMaximumIntegerDigits
927*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
928*0e209d39SAndroid Build Coastguard Worker      */
929*0e209d39SAndroid Build Coastguard Worker     int32_t getMaximumIntegerDigits() const;
930*0e209d39SAndroid Build Coastguard Worker 
931*0e209d39SAndroid Build Coastguard Worker     /**
932*0e209d39SAndroid Build Coastguard Worker      * Sets the maximum number of digits allowed in the integer portion of a
933*0e209d39SAndroid Build Coastguard Worker      * number. maximumIntegerDigits must be >= minimumIntegerDigits.  If the
934*0e209d39SAndroid Build Coastguard Worker      * new value for maximumIntegerDigits is less than the current value
935*0e209d39SAndroid Build Coastguard Worker      * of minimumIntegerDigits, then minimumIntegerDigits will also be set to
936*0e209d39SAndroid Build Coastguard Worker      * the new value.
937*0e209d39SAndroid Build Coastguard Worker      *
938*0e209d39SAndroid Build Coastguard Worker      * @param newValue    the new value for the maximum number of digits
939*0e209d39SAndroid Build Coastguard Worker      *                    allowed in the integer portion of a number.
940*0e209d39SAndroid Build Coastguard Worker      * @see getMaximumIntegerDigits
941*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
942*0e209d39SAndroid Build Coastguard Worker      */
943*0e209d39SAndroid Build Coastguard Worker     virtual void setMaximumIntegerDigits(int32_t newValue);
944*0e209d39SAndroid Build Coastguard Worker 
945*0e209d39SAndroid Build Coastguard Worker     /**
946*0e209d39SAndroid Build Coastguard Worker      * Returns the minimum number of digits allowed in the integer portion of a
947*0e209d39SAndroid Build Coastguard Worker      * number.
948*0e209d39SAndroid Build Coastguard Worker      * @return    the minimum number of digits allowed in the integer portion of a
949*0e209d39SAndroid Build Coastguard Worker      *            number.
950*0e209d39SAndroid Build Coastguard Worker      * @see setMinimumIntegerDigits
951*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
952*0e209d39SAndroid Build Coastguard Worker      */
953*0e209d39SAndroid Build Coastguard Worker     int32_t getMinimumIntegerDigits() const;
954*0e209d39SAndroid Build Coastguard Worker 
955*0e209d39SAndroid Build Coastguard Worker     /**
956*0e209d39SAndroid Build Coastguard Worker      * Sets the minimum number of digits allowed in the integer portion of a
957*0e209d39SAndroid Build Coastguard Worker      * number. minimumIntegerDigits must be &lt;= maximumIntegerDigits.  If the
958*0e209d39SAndroid Build Coastguard Worker      * new value for minimumIntegerDigits exceeds the current value
959*0e209d39SAndroid Build Coastguard Worker      * of maximumIntegerDigits, then maximumIntegerDigits will also be set to
960*0e209d39SAndroid Build Coastguard Worker      * the new value.
961*0e209d39SAndroid Build Coastguard Worker      * @param newValue    the new value to be set.
962*0e209d39SAndroid Build Coastguard Worker      * @see getMinimumIntegerDigits
963*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
964*0e209d39SAndroid Build Coastguard Worker      */
965*0e209d39SAndroid Build Coastguard Worker     virtual void setMinimumIntegerDigits(int32_t newValue);
966*0e209d39SAndroid Build Coastguard Worker 
967*0e209d39SAndroid Build Coastguard Worker     /**
968*0e209d39SAndroid Build Coastguard Worker      * Returns the maximum number of digits allowed in the fraction portion of a
969*0e209d39SAndroid Build Coastguard Worker      * number.
970*0e209d39SAndroid Build Coastguard Worker      * @return    the maximum number of digits allowed in the fraction portion of a
971*0e209d39SAndroid Build Coastguard Worker      *            number.
972*0e209d39SAndroid Build Coastguard Worker      * @see setMaximumFractionDigits
973*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
974*0e209d39SAndroid Build Coastguard Worker      */
975*0e209d39SAndroid Build Coastguard Worker     int32_t getMaximumFractionDigits() const;
976*0e209d39SAndroid Build Coastguard Worker 
977*0e209d39SAndroid Build Coastguard Worker     /**
978*0e209d39SAndroid Build Coastguard Worker      * Sets the maximum number of digits allowed in the fraction portion of a
979*0e209d39SAndroid Build Coastguard Worker      * number. maximumFractionDigits must be >= minimumFractionDigits.  If the
980*0e209d39SAndroid Build Coastguard Worker      * new value for maximumFractionDigits is less than the current value
981*0e209d39SAndroid Build Coastguard Worker      * of minimumFractionDigits, then minimumFractionDigits will also be set to
982*0e209d39SAndroid Build Coastguard Worker      * the new value.
983*0e209d39SAndroid Build Coastguard Worker      * @param newValue    the new value to be set.
984*0e209d39SAndroid Build Coastguard Worker      * @see getMaximumFractionDigits
985*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
986*0e209d39SAndroid Build Coastguard Worker      */
987*0e209d39SAndroid Build Coastguard Worker     virtual void setMaximumFractionDigits(int32_t newValue);
988*0e209d39SAndroid Build Coastguard Worker 
989*0e209d39SAndroid Build Coastguard Worker     /**
990*0e209d39SAndroid Build Coastguard Worker      * Returns the minimum number of digits allowed in the fraction portion of a
991*0e209d39SAndroid Build Coastguard Worker      * number.
992*0e209d39SAndroid Build Coastguard Worker      * @return    the minimum number of digits allowed in the fraction portion of a
993*0e209d39SAndroid Build Coastguard Worker      *            number.
994*0e209d39SAndroid Build Coastguard Worker      * @see setMinimumFractionDigits
995*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
996*0e209d39SAndroid Build Coastguard Worker      */
997*0e209d39SAndroid Build Coastguard Worker     int32_t getMinimumFractionDigits() const;
998*0e209d39SAndroid Build Coastguard Worker 
999*0e209d39SAndroid Build Coastguard Worker     /**
1000*0e209d39SAndroid Build Coastguard Worker      * Sets the minimum number of digits allowed in the fraction portion of a
1001*0e209d39SAndroid Build Coastguard Worker      * number. minimumFractionDigits must be &lt;= maximumFractionDigits.   If the
1002*0e209d39SAndroid Build Coastguard Worker      * new value for minimumFractionDigits exceeds the current value
1003*0e209d39SAndroid Build Coastguard Worker      * of maximumFractionDigits, then maximumIntegerDigits will also be set to
1004*0e209d39SAndroid Build Coastguard Worker      * the new value
1005*0e209d39SAndroid Build Coastguard Worker      * @param newValue    the new value to be set.
1006*0e209d39SAndroid Build Coastguard Worker      * @see getMinimumFractionDigits
1007*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
1008*0e209d39SAndroid Build Coastguard Worker      */
1009*0e209d39SAndroid Build Coastguard Worker     virtual void setMinimumFractionDigits(int32_t newValue);
1010*0e209d39SAndroid Build Coastguard Worker 
1011*0e209d39SAndroid Build Coastguard Worker     /**
1012*0e209d39SAndroid Build Coastguard Worker      * Sets the currency used to display currency
1013*0e209d39SAndroid Build Coastguard Worker      * amounts.  This takes effect immediately, if this format is a
1014*0e209d39SAndroid Build Coastguard Worker      * currency format.  If this format is not a currency format, then
1015*0e209d39SAndroid Build Coastguard Worker      * the currency is used if and when this object becomes a
1016*0e209d39SAndroid Build Coastguard Worker      * currency format.
1017*0e209d39SAndroid Build Coastguard Worker      * @param theCurrency a 3-letter ISO code indicating new currency
1018*0e209d39SAndroid Build Coastguard Worker      * to use.  It need not be null-terminated.  May be the empty
1019*0e209d39SAndroid Build Coastguard Worker      * string or nullptr to indicate no currency.
1020*0e209d39SAndroid Build Coastguard Worker      * @param ec input-output error code
1021*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 3.0
1022*0e209d39SAndroid Build Coastguard Worker      */
1023*0e209d39SAndroid Build Coastguard Worker     virtual void setCurrency(const char16_t* theCurrency, UErrorCode& ec);
1024*0e209d39SAndroid Build Coastguard Worker 
1025*0e209d39SAndroid Build Coastguard Worker     /**
1026*0e209d39SAndroid Build Coastguard Worker      * Gets the currency used to display currency
1027*0e209d39SAndroid Build Coastguard Worker      * amounts.  This may be an empty string for some subclasses.
1028*0e209d39SAndroid Build Coastguard Worker      * @return a 3-letter null-terminated ISO code indicating
1029*0e209d39SAndroid Build Coastguard Worker      * the currency in use, or a pointer to the empty string.
1030*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.6
1031*0e209d39SAndroid Build Coastguard Worker      */
1032*0e209d39SAndroid Build Coastguard Worker     const char16_t* getCurrency() const;
1033*0e209d39SAndroid Build Coastguard Worker 
1034*0e209d39SAndroid Build Coastguard Worker     /**
1035*0e209d39SAndroid Build Coastguard Worker      * Set a particular UDisplayContext value in the formatter, such as
1036*0e209d39SAndroid Build Coastguard Worker      * UDISPCTX_CAPITALIZATION_FOR_STANDALONE.
1037*0e209d39SAndroid Build Coastguard Worker      * @param value The UDisplayContext value to set.
1038*0e209d39SAndroid Build Coastguard Worker      * @param status Input/output status. If at entry this indicates a failure
1039*0e209d39SAndroid Build Coastguard Worker      *               status, the function will do nothing; otherwise this will be
1040*0e209d39SAndroid Build Coastguard Worker      *               updated with any new status from the function.
1041*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 53
1042*0e209d39SAndroid Build Coastguard Worker      */
1043*0e209d39SAndroid Build Coastguard Worker     virtual void setContext(UDisplayContext value, UErrorCode& status);
1044*0e209d39SAndroid Build Coastguard Worker 
1045*0e209d39SAndroid Build Coastguard Worker     /**
1046*0e209d39SAndroid Build Coastguard Worker      * Get the formatter's UDisplayContext value for the specified UDisplayContextType,
1047*0e209d39SAndroid Build Coastguard Worker      * such as UDISPCTX_TYPE_CAPITALIZATION.
1048*0e209d39SAndroid Build Coastguard Worker      * @param type The UDisplayContextType whose value to return
1049*0e209d39SAndroid Build Coastguard Worker      * @param status Input/output status. If at entry this indicates a failure
1050*0e209d39SAndroid Build Coastguard Worker      *               status, the function will do nothing; otherwise this will be
1051*0e209d39SAndroid Build Coastguard Worker      *               updated with any new status from the function.
1052*0e209d39SAndroid Build Coastguard Worker      * @return The UDisplayContextValue for the specified type.
1053*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 53
1054*0e209d39SAndroid Build Coastguard Worker      */
1055*0e209d39SAndroid Build Coastguard Worker     virtual UDisplayContext getContext(UDisplayContextType type, UErrorCode& status) const;
1056*0e209d39SAndroid Build Coastguard Worker 
1057*0e209d39SAndroid Build Coastguard Worker     /**
1058*0e209d39SAndroid Build Coastguard Worker      * Get the rounding mode. This will always return NumberFormat::ERoundingMode::kRoundUnnecessary
1059*0e209d39SAndroid Build Coastguard Worker      * if the subclass does not support rounding.
1060*0e209d39SAndroid Build Coastguard Worker      * @return A rounding mode
1061*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 60
1062*0e209d39SAndroid Build Coastguard Worker      */
1063*0e209d39SAndroid Build Coastguard Worker     virtual ERoundingMode getRoundingMode() const;
1064*0e209d39SAndroid Build Coastguard Worker 
1065*0e209d39SAndroid Build Coastguard Worker     /**
1066*0e209d39SAndroid Build Coastguard Worker      * Set the rounding mode. If a subclass does not support rounding, this will do nothing.
1067*0e209d39SAndroid Build Coastguard Worker      * @param roundingMode A rounding mode
1068*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 60
1069*0e209d39SAndroid Build Coastguard Worker      */
1070*0e209d39SAndroid Build Coastguard Worker     virtual void setRoundingMode(ERoundingMode roundingMode);
1071*0e209d39SAndroid Build Coastguard Worker 
1072*0e209d39SAndroid Build Coastguard Worker public:
1073*0e209d39SAndroid Build Coastguard Worker 
1074*0e209d39SAndroid Build Coastguard Worker     /**
1075*0e209d39SAndroid Build Coastguard Worker      * Return the class ID for this class.  This is useful for
1076*0e209d39SAndroid Build Coastguard Worker      * comparing to a return value from getDynamicClassID(). Note that,
1077*0e209d39SAndroid Build Coastguard Worker      * because NumberFormat is an abstract base class, no fully constructed object
1078*0e209d39SAndroid Build Coastguard Worker      * will have the class ID returned by NumberFormat::getStaticClassID().
1079*0e209d39SAndroid Build Coastguard Worker      * @return The class ID for all objects of this class.
1080*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
1081*0e209d39SAndroid Build Coastguard Worker      */
1082*0e209d39SAndroid Build Coastguard Worker     static UClassID U_EXPORT2 getStaticClassID();
1083*0e209d39SAndroid Build Coastguard Worker 
1084*0e209d39SAndroid Build Coastguard Worker     /**
1085*0e209d39SAndroid Build Coastguard Worker      * Returns a unique class ID POLYMORPHICALLY.  Pure virtual override.
1086*0e209d39SAndroid Build Coastguard Worker      * This method is to implement a simple version of RTTI, since not all
1087*0e209d39SAndroid Build Coastguard Worker      * C++ compilers support genuine RTTI.  Polymorphic operator==() and
1088*0e209d39SAndroid Build Coastguard Worker      * clone() methods call this method.
1089*0e209d39SAndroid Build Coastguard Worker      * <P>
1090*0e209d39SAndroid Build Coastguard Worker      * @return The class ID for this object. All objects of a
1091*0e209d39SAndroid Build Coastguard Worker      * given class have the same class ID.  Objects of
1092*0e209d39SAndroid Build Coastguard Worker      * other classes have different class IDs.
1093*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
1094*0e209d39SAndroid Build Coastguard Worker      */
1095*0e209d39SAndroid Build Coastguard Worker     virtual UClassID getDynamicClassID() const override = 0;
1096*0e209d39SAndroid Build Coastguard Worker 
1097*0e209d39SAndroid Build Coastguard Worker protected:
1098*0e209d39SAndroid Build Coastguard Worker 
1099*0e209d39SAndroid Build Coastguard Worker     /**
1100*0e209d39SAndroid Build Coastguard Worker      * Default constructor for subclass use only.
1101*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
1102*0e209d39SAndroid Build Coastguard Worker      */
1103*0e209d39SAndroid Build Coastguard Worker     NumberFormat();
1104*0e209d39SAndroid Build Coastguard Worker 
1105*0e209d39SAndroid Build Coastguard Worker     /**
1106*0e209d39SAndroid Build Coastguard Worker      * Copy constructor.
1107*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
1108*0e209d39SAndroid Build Coastguard Worker      */
1109*0e209d39SAndroid Build Coastguard Worker     NumberFormat(const NumberFormat&);
1110*0e209d39SAndroid Build Coastguard Worker 
1111*0e209d39SAndroid Build Coastguard Worker     /**
1112*0e209d39SAndroid Build Coastguard Worker      * Assignment operator.
1113*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
1114*0e209d39SAndroid Build Coastguard Worker      */
1115*0e209d39SAndroid Build Coastguard Worker     NumberFormat& operator=(const NumberFormat&);
1116*0e209d39SAndroid Build Coastguard Worker 
1117*0e209d39SAndroid Build Coastguard Worker     /**
1118*0e209d39SAndroid Build Coastguard Worker      * Returns the currency in effect for this formatter.  Subclasses
1119*0e209d39SAndroid Build Coastguard Worker      * should override this method as needed.  Unlike getCurrency(),
1120*0e209d39SAndroid Build Coastguard Worker      * this method should never return "".
1121*0e209d39SAndroid Build Coastguard Worker      * @result output parameter for null-terminated result, which must
1122*0e209d39SAndroid Build Coastguard Worker      * have a capacity of at least 4
1123*0e209d39SAndroid Build Coastguard Worker      * @internal
1124*0e209d39SAndroid Build Coastguard Worker      */
1125*0e209d39SAndroid Build Coastguard Worker     virtual void getEffectiveCurrency(char16_t* result, UErrorCode& ec) const;
1126*0e209d39SAndroid Build Coastguard Worker 
1127*0e209d39SAndroid Build Coastguard Worker #ifndef U_HIDE_INTERNAL_API
1128*0e209d39SAndroid Build Coastguard Worker     /**
1129*0e209d39SAndroid Build Coastguard Worker      * Creates the specified number format style of the desired locale.
1130*0e209d39SAndroid Build Coastguard Worker      * If mustBeDecimalFormat is true, then the returned pointer is
1131*0e209d39SAndroid Build Coastguard Worker      * either a DecimalFormat or it is nullptr.
1132*0e209d39SAndroid Build Coastguard Worker      * @internal
1133*0e209d39SAndroid Build Coastguard Worker      */
1134*0e209d39SAndroid Build Coastguard Worker     static NumberFormat* makeInstance(const Locale& desiredLocale,
1135*0e209d39SAndroid Build Coastguard Worker                                       UNumberFormatStyle style,
1136*0e209d39SAndroid Build Coastguard Worker                                       UBool mustBeDecimalFormat,
1137*0e209d39SAndroid Build Coastguard Worker                                       UErrorCode& errorCode);
1138*0e209d39SAndroid Build Coastguard Worker #endif  /* U_HIDE_INTERNAL_API */
1139*0e209d39SAndroid Build Coastguard Worker 
1140*0e209d39SAndroid Build Coastguard Worker private:
1141*0e209d39SAndroid Build Coastguard Worker 
1142*0e209d39SAndroid Build Coastguard Worker     static UBool isStyleSupported(UNumberFormatStyle style);
1143*0e209d39SAndroid Build Coastguard Worker 
1144*0e209d39SAndroid Build Coastguard Worker     /**
1145*0e209d39SAndroid Build Coastguard Worker      * Creates the specified decimal format style of the desired locale.
1146*0e209d39SAndroid Build Coastguard Worker      * @param desiredLocale    the given locale.
1147*0e209d39SAndroid Build Coastguard Worker      * @param style            the given style.
1148*0e209d39SAndroid Build Coastguard Worker      * @param errorCode        Output param filled with success/failure status.
1149*0e209d39SAndroid Build Coastguard Worker      * @return                 A new NumberFormat instance.
1150*0e209d39SAndroid Build Coastguard Worker      */
1151*0e209d39SAndroid Build Coastguard Worker     static NumberFormat* makeInstance(const Locale& desiredLocale,
1152*0e209d39SAndroid Build Coastguard Worker                                       UNumberFormatStyle style,
1153*0e209d39SAndroid Build Coastguard Worker                                       UErrorCode& errorCode);
1154*0e209d39SAndroid Build Coastguard Worker 
1155*0e209d39SAndroid Build Coastguard Worker     UBool       fGroupingUsed;
1156*0e209d39SAndroid Build Coastguard Worker     int32_t     fMaxIntegerDigits;
1157*0e209d39SAndroid Build Coastguard Worker     int32_t     fMinIntegerDigits;
1158*0e209d39SAndroid Build Coastguard Worker     int32_t     fMaxFractionDigits;
1159*0e209d39SAndroid Build Coastguard Worker     int32_t     fMinFractionDigits;
1160*0e209d39SAndroid Build Coastguard Worker 
1161*0e209d39SAndroid Build Coastguard Worker   protected:
1162*0e209d39SAndroid Build Coastguard Worker     /** \internal */
1163*0e209d39SAndroid Build Coastguard Worker     static const int32_t gDefaultMaxIntegerDigits;
1164*0e209d39SAndroid Build Coastguard Worker     /** \internal */
1165*0e209d39SAndroid Build Coastguard Worker     static const int32_t gDefaultMinIntegerDigits;
1166*0e209d39SAndroid Build Coastguard Worker 
1167*0e209d39SAndroid Build Coastguard Worker   private:
1168*0e209d39SAndroid Build Coastguard Worker     UBool      fParseIntegerOnly;
1169*0e209d39SAndroid Build Coastguard Worker     UBool      fLenient; // true => lenient parse is enabled
1170*0e209d39SAndroid Build Coastguard Worker 
1171*0e209d39SAndroid Build Coastguard Worker     // ISO currency code
1172*0e209d39SAndroid Build Coastguard Worker     char16_t      fCurrency[4];
1173*0e209d39SAndroid Build Coastguard Worker 
1174*0e209d39SAndroid Build Coastguard Worker     UDisplayContext fCapitalizationContext;
1175*0e209d39SAndroid Build Coastguard Worker 
1176*0e209d39SAndroid Build Coastguard Worker     friend class ICUNumberFormatFactory; // access to makeInstance
1177*0e209d39SAndroid Build Coastguard Worker     friend class ICUNumberFormatService;
1178*0e209d39SAndroid Build Coastguard Worker     friend class ::NumberFormatTest;  // access to isStyleSupported()
1179*0e209d39SAndroid Build Coastguard Worker };
1180*0e209d39SAndroid Build Coastguard Worker 
1181*0e209d39SAndroid Build Coastguard Worker #if !UCONFIG_NO_SERVICE
1182*0e209d39SAndroid Build Coastguard Worker /**
1183*0e209d39SAndroid Build Coastguard Worker  * A NumberFormatFactory is used to register new number formats.  The factory
1184*0e209d39SAndroid Build Coastguard Worker  * should be able to create any of the predefined formats for each locale it
1185*0e209d39SAndroid Build Coastguard Worker  * supports.  When registered, the locales it supports extend or override the
1186*0e209d39SAndroid Build Coastguard Worker  * locale already supported by ICU.
1187*0e209d39SAndroid Build Coastguard Worker  *
1188*0e209d39SAndroid Build Coastguard Worker  * @stable ICU 2.6
1189*0e209d39SAndroid Build Coastguard Worker  */
1190*0e209d39SAndroid Build Coastguard Worker class U_I18N_API NumberFormatFactory : public UObject {
1191*0e209d39SAndroid Build Coastguard Worker public:
1192*0e209d39SAndroid Build Coastguard Worker 
1193*0e209d39SAndroid Build Coastguard Worker     /**
1194*0e209d39SAndroid Build Coastguard Worker      * Destructor
1195*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 3.0
1196*0e209d39SAndroid Build Coastguard Worker      */
1197*0e209d39SAndroid Build Coastguard Worker     virtual ~NumberFormatFactory();
1198*0e209d39SAndroid Build Coastguard Worker 
1199*0e209d39SAndroid Build Coastguard Worker     /**
1200*0e209d39SAndroid Build Coastguard Worker      * Return true if this factory will be visible.  Default is true.
1201*0e209d39SAndroid Build Coastguard Worker      * If not visible, the locales supported by this factory will not
1202*0e209d39SAndroid Build Coastguard Worker      * be listed by getAvailableLocales.
1203*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.6
1204*0e209d39SAndroid Build Coastguard Worker      */
1205*0e209d39SAndroid Build Coastguard Worker     virtual UBool visible() const = 0;
1206*0e209d39SAndroid Build Coastguard Worker 
1207*0e209d39SAndroid Build Coastguard Worker     /**
1208*0e209d39SAndroid Build Coastguard Worker      * Return the locale names directly supported by this factory.  The number of names
1209*0e209d39SAndroid Build Coastguard Worker      * is returned in count;
1210*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.6
1211*0e209d39SAndroid Build Coastguard Worker      */
1212*0e209d39SAndroid Build Coastguard Worker     virtual const UnicodeString * getSupportedIDs(int32_t &count, UErrorCode& status) const = 0;
1213*0e209d39SAndroid Build Coastguard Worker 
1214*0e209d39SAndroid Build Coastguard Worker     /**
1215*0e209d39SAndroid Build Coastguard Worker      * Return a number format of the appropriate type.  If the locale
1216*0e209d39SAndroid Build Coastguard Worker      * is not supported, return null.  If the locale is supported, but
1217*0e209d39SAndroid Build Coastguard Worker      * the type is not provided by this service, return null.  Otherwise
1218*0e209d39SAndroid Build Coastguard Worker      * return an appropriate instance of NumberFormat.
1219*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.6
1220*0e209d39SAndroid Build Coastguard Worker      */
1221*0e209d39SAndroid Build Coastguard Worker     virtual NumberFormat* createFormat(const Locale& loc, UNumberFormatStyle formatType) = 0;
1222*0e209d39SAndroid Build Coastguard Worker };
1223*0e209d39SAndroid Build Coastguard Worker 
1224*0e209d39SAndroid Build Coastguard Worker /**
1225*0e209d39SAndroid Build Coastguard Worker  * A NumberFormatFactory that supports a single locale.  It can be visible or invisible.
1226*0e209d39SAndroid Build Coastguard Worker  * @stable ICU 2.6
1227*0e209d39SAndroid Build Coastguard Worker  */
1228*0e209d39SAndroid Build Coastguard Worker class U_I18N_API SimpleNumberFormatFactory : public NumberFormatFactory {
1229*0e209d39SAndroid Build Coastguard Worker protected:
1230*0e209d39SAndroid Build Coastguard Worker     /**
1231*0e209d39SAndroid Build Coastguard Worker      * True if the locale supported by this factory is visible.
1232*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.6
1233*0e209d39SAndroid Build Coastguard Worker      */
1234*0e209d39SAndroid Build Coastguard Worker     const UBool _visible;
1235*0e209d39SAndroid Build Coastguard Worker 
1236*0e209d39SAndroid Build Coastguard Worker     /**
1237*0e209d39SAndroid Build Coastguard Worker      * The locale supported by this factory, as a UnicodeString.
1238*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.6
1239*0e209d39SAndroid Build Coastguard Worker      */
1240*0e209d39SAndroid Build Coastguard Worker     UnicodeString _id;
1241*0e209d39SAndroid Build Coastguard Worker 
1242*0e209d39SAndroid Build Coastguard Worker public:
1243*0e209d39SAndroid Build Coastguard Worker     /**
1244*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.6
1245*0e209d39SAndroid Build Coastguard Worker      */
1246*0e209d39SAndroid Build Coastguard Worker     SimpleNumberFormatFactory(const Locale& locale, UBool visible = true);
1247*0e209d39SAndroid Build Coastguard Worker 
1248*0e209d39SAndroid Build Coastguard Worker     /**
1249*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 3.0
1250*0e209d39SAndroid Build Coastguard Worker      */
1251*0e209d39SAndroid Build Coastguard Worker     virtual ~SimpleNumberFormatFactory();
1252*0e209d39SAndroid Build Coastguard Worker 
1253*0e209d39SAndroid Build Coastguard Worker     /**
1254*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.6
1255*0e209d39SAndroid Build Coastguard Worker      */
1256*0e209d39SAndroid Build Coastguard Worker     virtual UBool visible() const override;
1257*0e209d39SAndroid Build Coastguard Worker 
1258*0e209d39SAndroid Build Coastguard Worker     /**
1259*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.6
1260*0e209d39SAndroid Build Coastguard Worker      */
1261*0e209d39SAndroid Build Coastguard Worker     virtual const UnicodeString * getSupportedIDs(int32_t &count, UErrorCode& status) const override;
1262*0e209d39SAndroid Build Coastguard Worker };
1263*0e209d39SAndroid Build Coastguard Worker #endif /* #if !UCONFIG_NO_SERVICE */
1264*0e209d39SAndroid Build Coastguard Worker 
1265*0e209d39SAndroid Build Coastguard Worker // -------------------------------------
1266*0e209d39SAndroid Build Coastguard Worker 
1267*0e209d39SAndroid Build Coastguard Worker inline UBool
isParseIntegerOnly()1268*0e209d39SAndroid Build Coastguard Worker NumberFormat::isParseIntegerOnly() const
1269*0e209d39SAndroid Build Coastguard Worker {
1270*0e209d39SAndroid Build Coastguard Worker     return fParseIntegerOnly;
1271*0e209d39SAndroid Build Coastguard Worker }
1272*0e209d39SAndroid Build Coastguard Worker 
1273*0e209d39SAndroid Build Coastguard Worker inline UBool
isLenient()1274*0e209d39SAndroid Build Coastguard Worker NumberFormat::isLenient() const
1275*0e209d39SAndroid Build Coastguard Worker {
1276*0e209d39SAndroid Build Coastguard Worker     return fLenient;
1277*0e209d39SAndroid Build Coastguard Worker }
1278*0e209d39SAndroid Build Coastguard Worker 
1279*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_END
1280*0e209d39SAndroid Build Coastguard Worker 
1281*0e209d39SAndroid Build Coastguard Worker #endif /* #if !UCONFIG_NO_FORMATTING */
1282*0e209d39SAndroid Build Coastguard Worker 
1283*0e209d39SAndroid Build Coastguard Worker #endif /* U_SHOW_CPLUSPLUS_API */
1284*0e209d39SAndroid Build Coastguard Worker 
1285*0e209d39SAndroid Build Coastguard Worker #endif // _NUMFMT
1286*0e209d39SAndroid Build Coastguard Worker //eof
1287