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