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