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