]> git.saurik.com Git - apple/icu.git/blame - icuSources/i18n/unicode/numfmt.h
ICU-531.48.tar.gz
[apple/icu.git] / icuSources / i18n / unicode / numfmt.h
CommitLineData
b75a7d8f 1/*
73c04bcf 2********************************************************************************
57a6839d 3* Copyright (C) 1997-2014, International Business Machines Corporation and others.
73c04bcf 4* All Rights Reserved.
b75a7d8f
A
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
73c04bcf 27/**
729e4ab9 28 * \file
73c04bcf
A
29 * \brief C++ API: Abstract base class for all number formats.
30 */
729e4ab9 31
b75a7d8f
A
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"
729e4ab9 38#include "unicode/stringpiece.h"
4388f060 39#include "unicode/curramt.h"
57a6839d 40#include "unicode/udisplaycontext.h"
4388f060
A
41
42class NumberFormatTest;
b75a7d8f
A
43
44U_NAMESPACE_BEGIN
45
57a6839d
A
46class SharedNumberFormat;
47
374ca955 48#if !UCONFIG_NO_SERVICE
b75a7d8f
A
49class NumberFormatFactory;
50class StringEnumeration;
374ca955 51#endif
b75a7d8f
A
52
53/**
73c04bcf 54 *
b75a7d8f
A
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>
51004dcb
A
77 * Note that there are additional factory methods within subclasses of
78 * NumberFormat.
79 * <P>
b75a7d8f
A
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;
374ca955 97 * \endcode
b75a7d8f
A
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>
729e4ab9
A
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>
b75a7d8f
A
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.
374ca955
A
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 *
b75a7d8f
A
170 * @stable ICU 2.0
171 */
172class U_I18N_API NumberFormat : public Format {
173public:
b75a7d8f
A
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 *
729e4ab9
A
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 *
4388f060
A
183 * These constants are provided for backwards compatibility only.
184 * Please use the C style constants defined in the header file unum.h.
185 *
b75a7d8f
A
186 * @see FieldPosition
187 * @stable ICU 2.0
188 */
189 enum EAlignmentFields {
4388f060
A
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,
b75a7d8f
A
212
213 /**
214 * These constants are provided for backwards compatibility only.
4388f060 215 * Please use the constants defined in the header file unum.h.
b75a7d8f 216 */
4388f060
A
217 /** @stable ICU 2.0 */
218 INTEGER_FIELD = UNUM_INTEGER_FIELD,
219 /** @stable ICU 2.0 */
220 FRACTION_FIELD = UNUM_FRACTION_FIELD
b75a7d8f
A
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
729e4ab9
A
237
238 using Format::format;
239
b75a7d8f
A
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
729e4ab9
A
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
b75a7d8f
A
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
374ca955
A
288 * indicates the position after the successfully parsed text. If
289 * an error occurs, parse_pos.index is unchanged.
b75a7d8f
A
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
374ca955
A
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.
73c04bcf 347 * @stable ICU 2.8
374ca955
A
348 */
349 UnicodeString& format( int64_t number,
350 UnicodeString& appendTo) const;
351
b75a7d8f
A
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;
51004dcb
A
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;
729e4ab9
A
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;
b75a7d8f
A
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
51004dcb
A
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
729e4ab9
A
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;
374ca955
A
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.
73c04bcf 466 * @stable ICU 2.8
374ca955
A
467 */
468 virtual UnicodeString& format(int64_t number,
469 UnicodeString& appendTo,
470 FieldPosition& pos) const;
51004dcb
A
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;
729e4ab9
A
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
b75a7d8f
A
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.
b75a7d8f
A
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.
b75a7d8f
A
608 * @see NumberFormat::isParseIntegerOnly
609 * @stable ICU 2.0
610 */
51004dcb
A
611 virtual void parse(const UnicodeString& text,
612 Formattable& result,
613 UErrorCode& status) const;
b75a7d8f 614
374ca955
A
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
4388f060
A
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.
51004dcb 632 * @stable ICU 49
374ca955 633 */
4388f060
A
634 virtual CurrencyAmount* parseCurrency(const UnicodeString& text,
635 ParsePosition& pos) const;
374ca955 636
b75a7d8f
A
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
374ca955 645 * only.
b75a7d8f
A
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);
729e4ab9 658
46f4442e 659 /**
4388f060 660 * Sets whether lenient parsing should be enabled (it is off by default).
46f4442e 661 *
4388f060
A
662 * @param enable <code>TRUE</code> if lenient parsing should be used,
663 * <code>FALSE</code> otherwise.
664 * @stable ICU 4.8
46f4442e 665 */
4388f060 666 virtual void setLenient(UBool enable);
729e4ab9 667
46f4442e 668 /**
4388f060 669 * Returns whether lenient parsing is enabled (it is off by default).
46f4442e 670 *
4388f060
A
671 * @return <code>TRUE</code> if lenient parsing is enabled,
672 * <code>FALSE</code> otherwise.
673 * @see #setLenient
674 * @stable ICU 4.8
46f4442e 675 */
4388f060 676 virtual UBool isLenient(void) const;
729e4ab9 677
b75a7d8f
A
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 */
374ca955 686 static NumberFormat* U_EXPORT2 createInstance(UErrorCode&);
b75a7d8f
A
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 */
374ca955 696 static NumberFormat* U_EXPORT2 createInstance(const Locale& inLocale,
b75a7d8f
A
697 UErrorCode&);
698
729e4ab9
A
699 /**
700 * Creates the specified decimal format style of the desired locale.
701 * @param desiredLocale the given locale.
4388f060
A
702 * @param style the given style.
703 * @param errorCode Output param filled with success/failure status.
729e4ab9 704 * @return A new NumberFormat instance.
4388f060 705 * @stable ICU 4.8
729e4ab9 706 */
4388f060
A
707 static NumberFormat* U_EXPORT2 createInstance(const Locale& desiredLocale,
708 UNumberFormatStyle style,
709 UErrorCode& errorCode);
729e4ab9 710
57a6839d
A
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
b75a7d8f
A
735 /**
736 * Returns a currency format for the current default locale.
737 * @stable ICU 2.0
738 */
374ca955 739 static NumberFormat* U_EXPORT2 createCurrencyInstance(UErrorCode&);
b75a7d8f
A
740
741 /**
742 * Returns a currency format for the specified locale.
743 * @param inLocale the given locale.
744 * @stable ICU 2.0
745 */
374ca955 746 static NumberFormat* U_EXPORT2 createCurrencyInstance(const Locale& inLocale,
b75a7d8f
A
747 UErrorCode&);
748
749 /**
750 * Returns a percentage format for the current default locale.
751 * @stable ICU 2.0
752 */
374ca955 753 static NumberFormat* U_EXPORT2 createPercentInstance(UErrorCode&);
b75a7d8f
A
754
755 /**
756 * Returns a percentage format for the specified locale.
757 * @param inLocale the given locale.
758 * @stable ICU 2.0
759 */
374ca955 760 static NumberFormat* U_EXPORT2 createPercentInstance(const Locale& inLocale,
b75a7d8f
A
761 UErrorCode&);
762
763 /**
764 * Returns a scientific format for the current default locale.
765 * @stable ICU 2.0
766 */
374ca955 767 static NumberFormat* U_EXPORT2 createScientificInstance(UErrorCode&);
b75a7d8f
A
768
769 /**
770 * Returns a scientific format for the specified locale.
771 * @param inLocale the given locale.
772 * @stable ICU 2.0
773 */
374ca955 774 static NumberFormat* U_EXPORT2 createScientificInstance(const Locale& inLocale,
b75a7d8f
A
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 */
374ca955 782 static const Locale* U_EXPORT2 getAvailableLocales(int32_t& count);
b75a7d8f 783
374ca955 784#if !UCONFIG_NO_SERVICE
b75a7d8f
A
785 /**
786 * Register a new NumberFormatFactory. The factory will be adopted.
57a6839d
A
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.
b75a7d8f
A
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
374ca955 793 * @stable ICU 2.6
b75a7d8f 794 */
374ca955 795 static URegistryKey U_EXPORT2 registerFactory(NumberFormatFactory* toAdopt, UErrorCode& status);
b75a7d8f
A
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.
57a6839d
A
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.
b75a7d8f
A
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
374ca955 807 * @stable ICU 2.6
b75a7d8f 808 */
374ca955 809 static UBool U_EXPORT2 unregister(URegistryKey key, UErrorCode& status);
b75a7d8f
A
810
811 /**
374ca955 812 * Return a StringEnumeration over the locales available at the time of the call,
b75a7d8f
A
813 * including registered locales.
814 * @return a StringEnumeration over the locales available at the time of the call
374ca955 815 * @stable ICU 2.6
b75a7d8f 816 */
374ca955
A
817 static StringEnumeration* U_EXPORT2 getAvailableLocales(void);
818#endif /* UCONFIG_NO_SERVICE */
b75a7d8f
A
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.
374ca955 833 * @param newValue True, grouping will be used in this format.
b75a7d8f
A
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 *
374ca955 856 * @param newValue the new value for the maximum number of digits
b75a7d8f
A
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.
374ca955 938 * @param ec input-output error code
73c04bcf 939 * @stable ICU 3.0
b75a7d8f 940 */
374ca955 941 virtual void setCurrency(const UChar* theCurrency, UErrorCode& ec);
b75a7d8f
A
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.
374ca955 948 * @stable ICU 2.6
b75a7d8f
A
949 */
950 const UChar* getCurrency() const;
951
57a6839d
A
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
b75a7d8f
A
977public:
978
979 /**
374ca955
A
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().
b75a7d8f
A
984 * @return The class ID for all objects of this class.
985 * @stable ICU 2.0
986 */
374ca955 987 static UClassID U_EXPORT2 getStaticClassID(void);
b75a7d8f
A
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
374ca955
A
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
51004dcb
A
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
b75a7d8f 1045private:
b75a7d8f 1046
4388f060
A
1047 static UBool isStyleSupported(UNumberFormatStyle style);
1048
b75a7d8f
A
1049 /**
1050 * Creates the specified decimal format style of the desired locale.
1051 * @param desiredLocale the given locale.
4388f060
A
1052 * @param style the given style.
1053 * @param errorCode Output param filled with success/failure status.
b75a7d8f
A
1054 * @return A new NumberFormat instance.
1055 */
4388f060
A
1056 static NumberFormat* makeInstance(const Locale& desiredLocale,
1057 UNumberFormatStyle style,
1058 UErrorCode& errorCode);
b75a7d8f 1059
57a6839d 1060 UBool fGroupingUsed;
729e4ab9
A
1061 int32_t fMaxIntegerDigits;
1062 int32_t fMinIntegerDigits;
1063 int32_t fMaxFractionDigits;
1064 int32_t fMinFractionDigits;
57a6839d
A
1065
1066 protected:
1067 static const int32_t gDefaultMaxIntegerDigits;
1068 static const int32_t gDefaultMinIntegerDigits;
1069
1070 private:
b75a7d8f 1071 UBool fParseIntegerOnly;
4388f060 1072 UBool fLenient; // TRUE => lenient parse is enabled
b75a7d8f
A
1073
1074 // ISO currency code
374ca955 1075 UChar fCurrency[4];
b75a7d8f 1076
57a6839d
A
1077 UDisplayContext fCapitalizationContext;
1078
4388f060 1079 friend class ICUNumberFormatFactory; // access to makeInstance
374ca955 1080 friend class ICUNumberFormatService;
4388f060 1081 friend class ::NumberFormatTest; // access to isStyleSupported()
b75a7d8f
A
1082};
1083
374ca955 1084#if !UCONFIG_NO_SERVICE
b75a7d8f
A
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 *
374ca955 1091 * @stable ICU 2.6
b75a7d8f
A
1092 */
1093class U_I18N_API NumberFormatFactory : public UObject {
1094public:
1095
374ca955
A
1096 /**
1097 * Destructor
73c04bcf 1098 * @stable ICU 3.0
374ca955
A
1099 */
1100 virtual ~NumberFormatFactory();
1101
b75a7d8f
A
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.
374ca955 1106 * @stable ICU 2.6
b75a7d8f
A
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;
374ca955 1113 * @stable ICU 2.6
b75a7d8f 1114 */
374ca955 1115 virtual const UnicodeString * getSupportedIDs(int32_t &count, UErrorCode& status) const = 0;
b75a7d8f
A
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.
374ca955 1122 * @stable ICU 2.6
b75a7d8f
A
1123 */
1124 virtual NumberFormat* createFormat(const Locale& loc, UNumberFormatStyle formatType) = 0;
1125};
1126
374ca955
A
1127/**
1128 * A NumberFormatFactory that supports a single locale. It can be visible or invisible.
73c04bcf 1129 * @stable ICU 2.6
374ca955 1130 */
b75a7d8f
A
1131class U_I18N_API SimpleNumberFormatFactory : public NumberFormatFactory {
1132protected:
1133 /**
1134 * True if the locale supported by this factory is visible.
374ca955 1135 * @stable ICU 2.6
b75a7d8f
A
1136 */
1137 const UBool _visible;
1138
1139 /**
1140 * The locale supported by this factory, as a UnicodeString.
374ca955 1141 * @stable ICU 2.6
b75a7d8f
A
1142 */
1143 UnicodeString _id;
1144
1145public:
1146 /**
374ca955 1147 * @stable ICU 2.6
b75a7d8f 1148 */
374ca955 1149 SimpleNumberFormatFactory(const Locale& locale, UBool visible = TRUE);
b75a7d8f
A
1150
1151 /**
73c04bcf 1152 * @stable ICU 3.0
b75a7d8f 1153 */
374ca955 1154 virtual ~SimpleNumberFormatFactory();
b75a7d8f
A
1155
1156 /**
374ca955 1157 * @stable ICU 2.6
b75a7d8f 1158 */
374ca955 1159 virtual UBool visible(void) const;
b75a7d8f 1160
374ca955
A
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 */
b75a7d8f
A
1167
1168// -------------------------------------
1169
b75a7d8f
A
1170inline UBool
1171NumberFormat::isParseIntegerOnly() const
1172{
1173 return fParseIntegerOnly;
1174}
1175
46f4442e 1176inline UBool
4388f060 1177NumberFormat::isLenient() const
46f4442e 1178{
4388f060 1179 return fLenient;
46f4442e
A
1180}
1181
b75a7d8f
A
1182U_NAMESPACE_END
1183
1184#endif /* #if !UCONFIG_NO_FORMATTING */
1185
1186#endif // _NUMFMT
1187//eof