• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 ********************************************************************************
3 * Copyright (C) 1997-2015, 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 
42 class NumberFormatTest;
43 
44 U_NAMESPACE_BEGIN
45 
46 class SharedNumberFormat;
47 
48 #if !UCONFIG_NO_SERVICE
49 class NumberFormatFactory;
50 class 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  */
172 class U_I18N_API NumberFormat : public Format {
173 public:
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;
528 public:
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 
573 public:
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  /* U_HIDE_INTERNAL_API */
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     /**
953      * Set a particular UDisplayContext value in the formatter, such as
954      * UDISPCTX_CAPITALIZATION_FOR_STANDALONE.
955      * @param value The UDisplayContext value to set.
956      * @param status Input/output status. If at entry this indicates a failure
957      *               status, the function will do nothing; otherwise this will be
958      *               updated with any new status from the function.
959      * @stable ICU 53
960      */
961     virtual void setContext(UDisplayContext value, UErrorCode& status);
962 
963     /**
964      * Get the formatter's UDisplayContext value for the specified UDisplayContextType,
965      * such as UDISPCTX_TYPE_CAPITALIZATION.
966      * @param type The UDisplayContextType whose value to return
967      * @param status Input/output status. If at entry this indicates a failure
968      *               status, the function will do nothing; otherwise this will be
969      *               updated with any new status from the function.
970      * @return The UDisplayContextValue for the specified type.
971      * @stable ICU 53
972      */
973     virtual UDisplayContext getContext(UDisplayContextType type, UErrorCode& status) const;
974 
975 public:
976 
977     /**
978      * Return the class ID for this class.  This is useful for
979      * comparing to a return value from getDynamicClassID(). Note that,
980      * because NumberFormat is an abstract base class, no fully constructed object
981      * will have the class ID returned by NumberFormat::getStaticClassID().
982      * @return The class ID for all objects of this class.
983      * @stable ICU 2.0
984      */
985     static UClassID U_EXPORT2 getStaticClassID(void);
986 
987     /**
988      * Returns a unique class ID POLYMORPHICALLY.  Pure virtual override.
989      * This method is to implement a simple version of RTTI, since not all
990      * C++ compilers support genuine RTTI.  Polymorphic operator==() and
991      * clone() methods call this method.
992      * <P>
993      * @return The class ID for this object. All objects of a
994      * given class have the same class ID.  Objects of
995      * other classes have different class IDs.
996      * @stable ICU 2.0
997      */
998     virtual UClassID getDynamicClassID(void) const = 0;
999 
1000 protected:
1001 
1002     /**
1003      * Default constructor for subclass use only.
1004      * @stable ICU 2.0
1005      */
1006     NumberFormat();
1007 
1008     /**
1009      * Copy constructor.
1010      * @stable ICU 2.0
1011      */
1012     NumberFormat(const NumberFormat&);
1013 
1014     /**
1015      * Assignment operator.
1016      * @stable ICU 2.0
1017      */
1018     NumberFormat& operator=(const NumberFormat&);
1019 
1020     /**
1021      * Returns the currency in effect for this formatter.  Subclasses
1022      * should override this method as needed.  Unlike getCurrency(),
1023      * this method should never return "".
1024      * @result output parameter for null-terminated result, which must
1025      * have a capacity of at least 4
1026      * @internal
1027      */
1028     virtual void getEffectiveCurrency(UChar* result, UErrorCode& ec) const;
1029 
1030 #ifndef U_HIDE_INTERNAL_API
1031     /**
1032      * Creates the specified number format style of the desired locale.
1033      * If mustBeDecimalFormat is TRUE, then the returned pointer is
1034      * either a DecimalFormat or it is NULL.
1035      * @internal
1036      */
1037     static NumberFormat* makeInstance(const Locale& desiredLocale,
1038                                       UNumberFormatStyle style,
1039                                       UBool mustBeDecimalFormat,
1040                                       UErrorCode& errorCode);
1041 #endif  /* U_HIDE_INTERNAL_API */
1042 
1043 private:
1044 
1045     static UBool isStyleSupported(UNumberFormatStyle style);
1046 
1047     /**
1048      * Creates the specified decimal format style of the desired locale.
1049      * @param desiredLocale    the given locale.
1050      * @param style            the given style.
1051      * @param errorCode        Output param filled with success/failure status.
1052      * @return                 A new NumberFormat instance.
1053      */
1054     static NumberFormat* makeInstance(const Locale& desiredLocale,
1055                                       UNumberFormatStyle style,
1056                                       UErrorCode& errorCode);
1057 
1058     UBool       fGroupingUsed;
1059     int32_t     fMaxIntegerDigits;
1060     int32_t     fMinIntegerDigits;
1061     int32_t     fMaxFractionDigits;
1062     int32_t     fMinFractionDigits;
1063 
1064   protected:
1065     static const int32_t gDefaultMaxIntegerDigits;
1066     static const int32_t gDefaultMinIntegerDigits;
1067 
1068   private:
1069     UBool      fParseIntegerOnly;
1070     UBool      fLenient; // TRUE => lenient parse is enabled
1071 
1072     // ISO currency code
1073     UChar      fCurrency[4];
1074 
1075     UDisplayContext fCapitalizationContext;
1076 
1077     friend class ICUNumberFormatFactory; // access to makeInstance
1078     friend class ICUNumberFormatService;
1079     friend class ::NumberFormatTest;  // access to isStyleSupported()
1080 };
1081 
1082 #if !UCONFIG_NO_SERVICE
1083 /**
1084  * A NumberFormatFactory is used to register new number formats.  The factory
1085  * should be able to create any of the predefined formats for each locale it
1086  * supports.  When registered, the locales it supports extend or override the
1087  * locale already supported by ICU.
1088  *
1089  * @stable ICU 2.6
1090  */
1091 class U_I18N_API NumberFormatFactory : public UObject {
1092 public:
1093 
1094     /**
1095      * Destructor
1096      * @stable ICU 3.0
1097      */
1098     virtual ~NumberFormatFactory();
1099 
1100     /**
1101      * Return true if this factory will be visible.  Default is true.
1102      * If not visible, the locales supported by this factory will not
1103      * be listed by getAvailableLocales.
1104      * @stable ICU 2.6
1105      */
1106     virtual UBool visible(void) const = 0;
1107 
1108     /**
1109      * Return the locale names directly supported by this factory.  The number of names
1110      * is returned in count;
1111      * @stable ICU 2.6
1112      */
1113     virtual const UnicodeString * getSupportedIDs(int32_t &count, UErrorCode& status) const = 0;
1114 
1115     /**
1116      * Return a number format of the appropriate type.  If the locale
1117      * is not supported, return null.  If the locale is supported, but
1118      * the type is not provided by this service, return null.  Otherwise
1119      * return an appropriate instance of NumberFormat.
1120      * @stable ICU 2.6
1121      */
1122     virtual NumberFormat* createFormat(const Locale& loc, UNumberFormatStyle formatType) = 0;
1123 };
1124 
1125 /**
1126  * A NumberFormatFactory that supports a single locale.  It can be visible or invisible.
1127  * @stable ICU 2.6
1128  */
1129 class U_I18N_API SimpleNumberFormatFactory : public NumberFormatFactory {
1130 protected:
1131     /**
1132      * True if the locale supported by this factory is visible.
1133      * @stable ICU 2.6
1134      */
1135     const UBool _visible;
1136 
1137     /**
1138      * The locale supported by this factory, as a UnicodeString.
1139      * @stable ICU 2.6
1140      */
1141     UnicodeString _id;
1142 
1143 public:
1144     /**
1145      * @stable ICU 2.6
1146      */
1147     SimpleNumberFormatFactory(const Locale& locale, UBool visible = TRUE);
1148 
1149     /**
1150      * @stable ICU 3.0
1151      */
1152     virtual ~SimpleNumberFormatFactory();
1153 
1154     /**
1155      * @stable ICU 2.6
1156      */
1157     virtual UBool visible(void) const;
1158 
1159     /**
1160      * @stable ICU 2.6
1161      */
1162     virtual const UnicodeString * getSupportedIDs(int32_t &count, UErrorCode& status) const;
1163 };
1164 #endif /* #if !UCONFIG_NO_SERVICE */
1165 
1166 // -------------------------------------
1167 
1168 inline UBool
isParseIntegerOnly()1169 NumberFormat::isParseIntegerOnly() const
1170 {
1171     return fParseIntegerOnly;
1172 }
1173 
1174 inline UBool
isLenient()1175 NumberFormat::isLenient() const
1176 {
1177     return fLenient;
1178 }
1179 
1180 U_NAMESPACE_END
1181 
1182 #endif /* #if !UCONFIG_NO_FORMATTING */
1183 
1184 #endif // _NUMFMT
1185 //eof
1186