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