/* ******************************************************************************** * Copyright (C) 1997-2001, International Business Machines * Corporation and others. All Rights Reserved. ******************************************************************************** * * File DECIMFMT.H * * Modification History: * * Date Name Description * 02/19/97 aliu Converted from java. * 03/20/97 clhuang Updated per C++ implementation. * 04/03/97 aliu Rewrote parsing and formatting completely, and * cleaned up and debugged. Actually works now. * 04/17/97 aliu Changed DigitCount to int per code review. * 07/10/97 helena Made ParsePosition a class and get rid of the function * hiding problems. * 09/09/97 aliu Ported over support for exponential formats. * 07/20/98 stephen Changed documentation ******************************************************************************** */ #ifndef DECIMFMT_H #define DECIMFMT_H #include "unicode/utypes.h" #include "unicode/numfmt.h" #include "unicode/locid.h" class DecimalFormatSymbols; class DigitList; /** * Concrete class for formatting decimal numbers, allowing a variety * of parameters, and localization to Western, Arabic, or Indic numbers. *

* Normally, you get the proper NumberFormat for a specific locale * (including the default locale) using the NumberFormat factory methods, * rather than constructing a DecimalNumberFormat directly. *

* Either the prefixes or the suffixes must be different for the parse * to distinguish positive from negative. Parsing will be unreliable * if the digits, thousands or decimal separators are the same, or if * any of them occur in the prefixes or suffixes. *

* [Special cases:] *

* NaN is formatted as a single character, typically \\uFFFD. *

* +/-Infinity is formatted as a single character, typically \\u221E, * plus the positive and negative pre/suffixes. *

* Note: this class is designed for common users; for very large or small * numbers, use a format that can express exponential values. *

* [Example:] *

 * \code
 *     // normally we would have a GUI with a menu for this
 *     int32_t locCount;
 *     const Locale* locales = NumberFormat::getAvailableLocales(locCount);
 *     if (locCount > 12) locCount = 12;  //limit output
 * 
 *     double myNumber = -1234.56;
 *     UErrorCode success = U_ZERO_ERROR;
 *     NumberFormat* form; //= NumberFormat::createInstance(success);
 * 
 *     // just for fun, we print out a number with the locale number, currency
 *     // and percent format for each locale we can.
 *     UnicodeString countryName;
 *     UnicodeString displayName;
 *     UnicodeString str;
 *     UnicodeString pattern;
 *     Formattable fmtable;
 *     for (int32_t j = 0; j < 3; ++j) {
 *         cout << endl << "FORMAT " << j << endl;
 *         for (int32_t i = 0; i < locCount; ++i) {
 *             if (locales[i].getCountry(countryName).size() == 0) {
 *                 // skip language-only
 *                 continue;
 *             }
 *             switch (j) {
 *             default:
 *                 form = NumberFormat::createInstance(locales[i], success ); break;
 *             case 1:
 *                 form = NumberFormat::createCurrencyInstance(locales[i], success ); break;
 *             case 0:
 *                 form = NumberFormat::createPercentInstance(locales[i], success ); break;
 *             }
 *             if (form) {
 *                 str.remove();
 *                 pattern = ((DecimalFormat*)form)->toPattern(pattern);
 *                 cout << locales[i].getDisplayName(displayName) << ": " << pattern;
 *                 cout << "  ->  " << form->format(myNumber,str) << endl;
 *                 form->parse(form->format(myNumber,str), fmtable, success);
 *                 //cout << "   parsed: " << fmtable << endl;
 *                 delete form;  
 *             }
 *         }
 *     }
 * \endcode
 * 
* [The following shows the structure of the pattern.] *
 * \code
 *     pattern    := subpattern{;subpattern}
 *     subpattern := {prefix}integer{.fraction}{suffix}
 *     
 *     prefix     := '\\u0000'..'\\uFFFD' - specialCharacters
 *     suffix     := '\\u0000'..'\\uFFFD' - specialCharacters
 *     integer    := '#'* '0'* '0'
 *     fraction   := '0'* '#'*
 *   
 *  Notation:
 *     X*       0 or more instances of X
 *     (X | Y)  either X or Y.
 *     X..Y     any character from X up to Y, inclusive.
 *     S - T    characters in S, except those in T
 * \code
 * /pre>
 * The first subpattern is for positive numbers. The second (optional)
 * subpattern is used for negative numbers. (In both cases, ',' can
 * occur inside the integer portion--it is just too messy to indicate
 * in BNF.)  For the second subpattern, only the PREFIX and SUFFIX are
 * noted; other attributes are taken only from the first subpattern.
 * 

* Here are the special characters used in the parts of the * subpattern, with notes on their usage. *

 * \code
 *     Symbol   Meaning
 *       0      a digit, showing up a zero if it is zero
 *       #      a digit, supressed if zero
 *       .      placeholder for decimal separator
 *       ,      placeholder for grouping separator.
 *       E      separates mantissa and exponent for exponential formats.
 *       ;      separates formats.
 *       -      default negative prefix.
 *       %      multiply by 100 and show as percentage
 *       \u2030 multiply by 1000 and show as per mille
 *       \u00A4 currency sign; replaced by currency symbol; if
 *              doubled, replaced by international currency symbol.
 *              If present in a pattern, the monetary decimal separator
 *              is used instead of the decimal separator.
 *       X      any other characters can be used in the prefix or suffix
 *       '      used to quote special characters in a prefix or suffix.
 * \endcode
 * 
* [Notes] *

* If there is no explicit negative subpattern, - is prefixed to the * positive form. That is, "0.00" alone is equivalent to "0.00;-0.00". *

* Illegal formats, such as "#.#.#" in the same format, will cause a * failing UErrorCode to be returned. *

* The grouping separator is commonly used for thousands, but in some * countries for ten-thousands. The interval is a constant number of * digits between the grouping characters, such as 100,000,000 or 1,0000,0000. * If you supply a pattern with multiple grouping characters, the interval * between the last one and the end of the integer determines the primary * grouping size, and the interval between the last two determines * the secondary grouping size (see below); all others are ignored. * So "#,##,###,####" == "###,###,####" == "##,#,###,####". *

* Some locales have two different grouping intervals: One used for the * least significant integer digits (the primary grouping size), and * one used for all others (the secondary grouping size). For example, * if the primary grouping interval is 3, and the secondary is 2, then * this corresponds to the pattern "#,##,##0", and the number 123456789 * is formatted as "12,34,56,789". *

* This class only handles localized digits where the 10 digits are * contiguous in Unicode, from 0 to 9. Other digits sets (such as * superscripts) would need a different subclass. */ class U_I18N_API DecimalFormat: public NumberFormat { public: enum ERoundingMode { kRoundCeiling, kRoundFloor, kRoundDown, kRoundUp, kRoundHalfEven, kRoundHalfDown, kRoundHalfUp // We don't support ROUND_UNNECESSARY }; enum EPadPosition { kPadBeforePrefix, kPadAfterPrefix, kPadBeforeSuffix, kPadAfterSuffix }; /** * Create a DecimalFormat using the default pattern and symbols * for the default locale. This is a convenient way to obtain a * DecimalFormat when internationalization is not the main concern. *

* To obtain standard formats for a given locale, use the factory methods * on NumberFormat such as getNumberInstance. These factories will * return the most appropriate sub-class of NumberFormat for a given * locale. * @param status Output param set to success/failure code. If the * pattern is invalid this will be set to a failure code. * @stable */ DecimalFormat(UErrorCode& status); /** * Create a DecimalFormat from the given pattern and the symbols * for the default locale. This is a convenient way to obtain a * DecimalFormat when internationalization is not the main concern. *

* To obtain standard formats for a given locale, use the factory methods * on NumberFormat such as getNumberInstance. These factories will * return the most appropriate sub-class of NumberFormat for a given * locale. * @param pattern A non-localized pattern string. * @param status Output param set to success/failure code. If the * pattern is invalid this will be set to a failure code. * @stable */ DecimalFormat(const UnicodeString& pattern, UErrorCode& status); /** * Create a DecimalFormat from the given pattern and symbols. * Use this constructor when you need to completely customize the * behavior of the format. *

* To obtain standard formats for a given * locale, use the factory methods on NumberFormat such as * getInstance or getCurrencyInstance. If you need only minor adjustments * to a standard format, you can modify the format returned by * a NumberFormat factory method. * * @param pattern a non-localized pattern string * @param symbolsToAdopt the set of symbols to be used. The caller should not * delete this object after making this call. * @param status Output param set to success/failure code. If the * pattern is invalid this will be set to a failure code. * @stable */ DecimalFormat( const UnicodeString& pattern, DecimalFormatSymbols* symbolsToAdopt, UErrorCode& status); /** * Create a DecimalFormat from the given pattern and symbols. * Use this constructor when you need to completely customize the * behavior of the format. *

* To obtain standard formats for a given * locale, use the factory methods on NumberFormat such as * getInstance or getCurrencyInstance. If you need only minor adjustments * to a standard format, you can modify the format returned by * a NumberFormat factory method. * * @param pattern a non-localized pattern string * @param symbolsToAdopt the set of symbols to be used. The caller should not * delete this object after making this call. * @param parseError Output param to receive errors occured during parsing * @param status Output param set to success/failure code. If the * pattern is invalid this will be set to a failure code. * @stable */ DecimalFormat( const UnicodeString& pattern, DecimalFormatSymbols* symbolsToAdopt, UParseError& parseError, UErrorCode& status); /** * Create a DecimalFormat from the given pattern and symbols. * Use this constructor when you need to completely customize the * behavior of the format. *

* To obtain standard formats for a given * locale, use the factory methods on NumberFormat such as * getInstance or getCurrencyInstance. If you need only minor adjustments * to a standard format, you can modify the format returned by * a NumberFormat factory method. * * @param pattern a non-localized pattern string * @param symbols the set of symbols to be used * @param status Output param set to success/failure code. If the * pattern is invalid this will be set to a failure code. * @stable */ DecimalFormat( const UnicodeString& pattern, const DecimalFormatSymbols& symbols, UErrorCode& status); /** * Copy constructor. * @stable */ DecimalFormat(const DecimalFormat& source); /** * Assignment operator. * @stable */ DecimalFormat& operator=(const DecimalFormat& rhs); /** * Destructor. * @stable */ virtual ~DecimalFormat(); /** * Clone this Format object polymorphically. The caller owns the * result and should delete it when done. * @stable */ virtual Format* clone(void) const; /** * Return true if the given Format objects are semantically equal. * Objects of different subclasses are considered unequal. * @stable */ virtual UBool operator==(const Format& other) const; /** * Format a double or long number using base-10 representation. * * @param number The value to be formatted. * @param toAppendTo The string to append the formatted string to. * This is an output parameter. * @param pos On input: an alignment field, if desired. * On output: the offsets of the alignment field. * @return A reference to 'toAppendTo'. * @stable */ virtual UnicodeString& format(double number, UnicodeString& toAppendTo, FieldPosition& pos) const; virtual UnicodeString& format(int32_t number, UnicodeString& toAppendTo, FieldPosition& pos) const; virtual UnicodeString& format(const Formattable& obj, UnicodeString& toAppendTo, FieldPosition& pos, UErrorCode& status) const; /** * Redeclared NumberFormat method. * @stable */ UnicodeString& format(const Formattable& obj, UnicodeString& result, UErrorCode& status) const; /** * Redeclared NumberFormat method. * @stable */ UnicodeString& format(double number, UnicodeString& output) const; /** * Redeclared NumberFormat method. * @stable */ UnicodeString& format(int32_t number, UnicodeString& output) const; /** * Parse the given string using this object's choices. The method * does string comparisons to try to find an optimal match. * If no object can be parsed, index is unchanged, and NULL is * returned. The result is returned as the most parsimonious * type of Formattable that will accomodate all of the * necessary precision. For example, if the result is exactly 12, * it will be returned as a long. However, if it is 1.5, it will * be returned as a double. * * @param text The text to be parsed. * @param result Formattable to be set to the parse result. * If parse fails, return contents are undefined. * @param parsePosition The position to start parsing at on input. * On output, moved to after the last successfully * parse character. On parse failure, does not change. * @see Formattable * @stable */ virtual void parse(const UnicodeString& text, Formattable& result, ParsePosition& parsePosition) const; // Declare here again to get rid of function hiding problems. virtual void parse(const UnicodeString& text, Formattable& result, UErrorCode& error) const; /** * Returns the decimal format symbols, which is generally not changed * by the programmer or user. * @return desired DecimalFormatSymbols * @see DecimalFormatSymbols * @stable */ virtual const DecimalFormatSymbols* getDecimalFormatSymbols(void) const; /** * Sets the decimal format symbols, which is generally not changed * by the programmer or user. * @param symbolsToAdopt DecimalFormatSymbols to be adopted. * @stable */ virtual void adoptDecimalFormatSymbols(DecimalFormatSymbols* symbolsToAdopt); /** * Sets the decimal format symbols, which is generally not changed * by the programmer or user. * @param symbols DecimalFormatSymbols. * @stable */ virtual void setDecimalFormatSymbols(const DecimalFormatSymbols& symbols); /** * Get the positive prefix. * * Examples: +123, $123, sFr123 * @stable */ UnicodeString& getPositivePrefix(UnicodeString& result) const; /** * Set the positive prefix. * * Examples: +123, $123, sFr123 * @stable */ virtual void setPositivePrefix(const UnicodeString& newValue); /** * Get the negative prefix. * * Examples: -123, ($123) (with negative suffix), sFr-123 * @stable */ UnicodeString& getNegativePrefix(UnicodeString& result) const; /** * Set the negative prefix. * * Examples: -123, ($123) (with negative suffix), sFr-123 * @stable */ virtual void setNegativePrefix(const UnicodeString& newValue); /** * Get the positive suffix. * * Example: 123% * @stable */ UnicodeString& getPositiveSuffix(UnicodeString& result) const; /** * Set the positive suffix. * * Example: 123% * @stable */ virtual void setPositiveSuffix(const UnicodeString& newValue); /** * Get the negative suffix. * * Examples: -123%, ($123) (with positive suffixes) * @stable */ UnicodeString& getNegativeSuffix(UnicodeString& result) const; /** * Set the positive suffix. * * Examples: 123% * @stable */ virtual void setNegativeSuffix(const UnicodeString& newValue); /** * Get the multiplier for use in percent, permill, etc. * For a percentage, set the suffixes to have "%" and the multiplier to be 100. * (For Arabic, use arabic percent symbol). * For a permill, set the suffixes to have "\u2031" and the multiplier to be 1000. * * Examples: with 100, 1.23 -> "123", and "123" -> 1.23 * @stable */ int32_t getMultiplier(void) const; /** * Set the multiplier for use in percent, permill, etc. * For a percentage, set the suffixes to have "%" and the multiplier to be 100. * (For Arabic, use arabic percent symbol). * For a permill, set the suffixes to have "\u2031" and the multiplier to be 1000. * * Examples: with 100, 1.23 -> "123", and "123" -> 1.23 */ virtual void setMultiplier(int32_t newValue); /** * Get the rounding increment. * @return A positive rounding increment, or 0.0 if rounding * is not in effect. * @see #setRoundingIncrement * @see #getRoundingMode * @see #setRoundingMode * @stable */ virtual double getRoundingIncrement(void); /** * Set the rounding increment. This method also controls whether * rounding is enabled. * @param newValue A positive rounding increment, or 0.0 to disable rounding. * Negative increments are equivalent to 0.0. * @see #getRoundingIncrement * @see #getRoundingMode * @see #setRoundingMode * @stable */ virtual void setRoundingIncrement(double newValue); /** * Get the rounding mode. * @return A rounding mode * @see #setRoundingIncrement * @see #getRoundingIncrement * @see #setRoundingMode * @stable */ virtual ERoundingMode getRoundingMode(void); /** * Set the rounding mode. This has no effect unless the rounding * increment is greater than zero. * @param roundingMode A rounding mode * @see #setRoundingIncrement * @see #getRoundingIncrement * @see #getRoundingMode * @stable */ virtual void setRoundingMode(ERoundingMode roundingMode); /** * Get the width to which the output of format() is padded. * @return the format width, or zero if no padding is in effect * @see #setFormatWidth * @see #getPadCharacter * @see #setPadCharacter * @see #getPadPosition * @see #setPadPosition * @stable */ virtual int32_t getFormatWidth(void); /** * Set the width to which the output of format() is padded. * This method also controls whether padding is enabled. * @param width the width to which to pad the result of * format(), or zero to disable padding. A negative * width is equivalent to 0. * @see #getFormatWidth * @see #getPadCharacter * @see #setPadCharacter * @see #getPadPosition * @see #setPadPosition * @stable */ virtual void setFormatWidth(int32_t width); /** * Get the first code unit of the string used to pad to the format width. The default is ' '. * @return the first code unit of the pad string * @see #setFormatWidth * @see #getFormatWidth * @see #setPadCharacter * @see #getPadPosition * @see #setPadPosition * @deprecated remove after 2000-dec-31. See the other getPadCharacter() function */ inline UChar getPadCharacter(void); /** * Get the grapheme string (a character, possibly with modifier letters) * used to pad to the format width. The default is " ". * Note: The current implementation only stores the first code unit of the * pad string. * @return the pad grapheme string * @see #setFormatWidth * @see #getFormatWidth * @see #setPadCharacter * @see #getPadPosition * @see #setPadPosition * @draft */ virtual UnicodeString getPadCharacterString(); /** * Set a one-code unit string used to pad to the format width. This has no effect * unless padding is enabled. * @param padChar the pad character that is used to construct the pad string * @see #setFormatWidth * @see #getFormatWidth * @see #getPadCharacter * @see #getPadPosition * @see #setPadPosition * @deprecated remove after 2000-dec-31. See the other setPadCharacter() function */ inline void setPadCharacter(UChar padChar); /** * Set the grapheme string (a character, possibly with modifier letters) * used to pad to the format width. This has no effect * unless padding is enabled. * Note: The current implementation only stores the first code unit of the * pad string. * @param padChar the pad grapheme * @see #setFormatWidth * @see #getFormatWidth * @see #getPadCharacter * @see #getPadPosition * @see #setPadPosition * @draft */ virtual void setPadCharacter(UnicodeString padChar); /** * Get the position at which padding will take place. This is the location * at which padding will be inserted if the result of format() * is shorter than the format width. * @return the pad position, one of kPadBeforePrefix, * kPadAfterPrefix, kPadBeforeSuffix, or * kPadAfterSuffix. * @see #setFormatWidth * @see #getFormatWidth * @see #setPadCharacter * @see #getPadCharacter * @see #setPadPosition * @see #kPadBeforePrefix * @see #kPadAfterPrefix * @see #kPadBeforeSuffix * @see #kPadAfterSuffix * @stable */ virtual EPadPosition getPadPosition(void); /** * NEW * Set the position at which padding will take place. This is the location * at which padding will be inserted if the result of format() * is shorter than the format width. This has no effect unless padding is * enabled. * @param padPos the pad position, one of kPadBeforePrefix, * kPadAfterPrefix, kPadBeforeSuffix, or * kPadAfterSuffix. * @see #setFormatWidth * @see #getFormatWidth * @see #setPadCharacter * @see #getPadCharacter * @see #getPadPosition * @see #kPadBeforePrefix * @see #kPadAfterPrefix * @see #kPadBeforeSuffix * @see #kPadAfterSuffix * @stable */ virtual void setPadPosition(EPadPosition padPos); /** * Return whether or not scientific notation is used. * @return TRUE if this object formats and parses scientific notation * @see #setScientificNotation * @see #getMinimumExponentDigits * @see #setMinimumExponentDigits * @see #isExponentSignAlwaysShown * @see #setExponentSignAlwaysShown * @stable */ virtual UBool isScientificNotation(void); /** * Set whether or not scientific notation is used. * @param useScientific TRUE if this object formats and parses scientific * notation * @see #isScientificNotation * @see #getMinimumExponentDigits * @see #setMinimumExponentDigits * @see #isExponentSignAlwaysShown * @see #setExponentSignAlwaysShown * @stable */ virtual void setScientificNotation(UBool useScientific); /** * Return the minimum exponent digits that will be shown. * @return the minimum exponent digits that will be shown * @see #setScientificNotation * @see #isScientificNotation * @see #setMinimumExponentDigits * @see #isExponentSignAlwaysShown * @see #setExponentSignAlwaysShown * @stable */ virtual int8_t getMinimumExponentDigits(void); /** * Set the minimum exponent digits that will be shown. This has no * effect unless scientific notation is in use. * @param minExpDig a value >= 1 indicating the fewest exponent digits * that will be shown. Values less than 1 will be treated as 1. * @see #setScientificNotation * @see #isScientificNotation * @see #getMinimumExponentDigits * @see #isExponentSignAlwaysShown * @see #setExponentSignAlwaysShown * @stable */ virtual void setMinimumExponentDigits(int8_t minExpDig); /** * Return whether the exponent sign is always shown. * @return TRUE if the exponent is always prefixed with either the * localized minus sign or the localized plus sign, false if only negative * exponents are prefixed with the localized minus sign. * @see #setScientificNotation * @see #isScientificNotation * @see #setMinimumExponentDigits * @see #getMinimumExponentDigits * @see #setExponentSignAlwaysShown * @stable */ virtual UBool isExponentSignAlwaysShown(void); /** * Set whether the exponent sign is always shown. This has no effect * unless scientific notation is in use. * @param expSignAlways TRUE if the exponent is always prefixed with either * the localized minus sign or the localized plus sign, false if only * negative exponents are prefixed with the localized minus sign. * @see #setScientificNotation * @see #isScientificNotation * @see #setMinimumExponentDigits * @see #getMinimumExponentDigits * @see #isExponentSignAlwaysShown * @stable */ virtual void setExponentSignAlwaysShown(UBool expSignAlways); /** * Return the grouping size. Grouping size is the number of digits between * grouping separators in the integer portion of a number. For example, * in the number "123,456.78", the grouping size is 3. * @see setGroupingSize * @see NumberFormat::isGroupingUsed * @see DecimalFormatSymbols::getGroupingSeparator * @stable */ int32_t getGroupingSize(void) const; /** * Set the grouping size. Grouping size is the number of digits between * grouping separators in the integer portion of a number. For example, * in the number "123,456.78", the grouping size is 3. * @see getGroupingSize * @see NumberFormat::setGroupingUsed * @see DecimalFormatSymbols::setGroupingSeparator * @stable */ virtual void setGroupingSize(int32_t newValue); /** * Return the secondary grouping size. In some locales one * grouping interval is used for the least significant integer * digits (the primary grouping size), and another is used for all * others (the secondary grouping size). A formatter supporting a * secondary grouping size will return a positive integer unequal * to the primary grouping size returned by * getGroupingSize(). For example, if the primary * grouping size is 4, and the secondary grouping size is 2, then * the number 123456789 formats as "1,23,45,6789", and the pattern * appears as "#,##,###0". * @return the secondary grouping size, or a value less than * one if there is none * @see setSecondaryGroupingSize * @see NumberFormat::isGroupingUsed * @see DecimalFormatSymbols::getGroupingSeparator */ int32_t getSecondaryGroupingSize(void) const; /** * Set the secondary grouping size. If set to a value less than 1, * then secondary grouping is turned off, and the primary grouping * size is used for all intervals, not just the least significant. * @see getSecondaryGroupingSize * @see NumberFormat#setGroupingUsed * @see DecimalFormatSymbols::setGroupingSeparator */ virtual void setSecondaryGroupingSize(int32_t newValue); /** * Allows you to get the behavior of the decimal separator with integers. * (The decimal separator will always appear with decimals.) * * Example: Decimal ON: 12345 -> 12345.; OFF: 12345 -> 12345 * @stable */ UBool isDecimalSeparatorAlwaysShown(void) const; /** * Allows you to set the behavior of the decimal separator with integers. * (The decimal separator will always appear with decimals.) * * Example: Decimal ON: 12345 -> 12345.; OFF: 12345 -> 12345 * @stable */ virtual void setDecimalSeparatorAlwaysShown(UBool newValue); /** * Synthesizes a pattern string that represents the current state * of this Format object. * @see applyPattern * @stable */ virtual UnicodeString& toPattern(UnicodeString& result) const; /** * Synthesizes a localized pattern string that represents the current * state of this Format object. * * @see applyPattern * @stable */ virtual UnicodeString& toLocalizedPattern(UnicodeString& result) const; /** * Apply the given pattern to this Format object. A pattern is a * short-hand specification for the various formatting properties. * These properties can also be changed individually through the * various setter methods. *

* There is no limit to integer digits are set * by this routine, since that is the typical end-user desire; * use setMaximumInteger if you want to set a real value. * For negative numbers, use a second pattern, separated by a semicolon *

     * .      Example "#,#00.0#" -> 1,234.56
     * 
* This means a minimum of 2 integer digits, 1 fraction digit, and * a maximum of 2 fraction digits. *
     * .      Example: "#,#00.0#;(#,#00.0#)" for negatives in parantheses.
     * 
* In negative patterns, the minimum and maximum counts are ignored; * these are presumed to be set in the positive pattern. * * @param pattern The pattern to be applied. * @param pattern The pattern to be applied. * @param parseError Struct to recieve information on position * of error if an error is encountered * @param status Output param set to success/failure code on * exit. If the pattern is invalid, this will be * set to a failure result. * @stable */ virtual void applyPattern(const UnicodeString& pattern, UParseError& parseError, UErrorCode& status); /** * Sets the pattern. * @param pattern The pattern to be applied. * @param status Output param set to success/failure code on * exit. If the pattern is invalid, this will be * set to a failure result. * @stable */ virtual void applyPattern(const UnicodeString& pattern, UErrorCode& status); /** * Apply the given pattern to this Format object. The pattern * is assumed to be in a localized notation. A pattern is a * short-hand specification for the various formatting properties. * These properties can also be changed individually through the * various setter methods. *

* There is no limit to integer digits are set * by this routine, since that is the typical end-user desire; * use setMaximumInteger if you want to set a real value. * For negative numbers, use a second pattern, separated by a semicolon *

     * .      Example "#,#00.0#" -> 1,234.56
     * 
* This means a minimum of 2 integer digits, 1 fraction digit, and * a maximum of 2 fraction digits. * * Example: "#,#00.0#;(#,#00.0#)" for negatives in parantheses. * * In negative patterns, the minimum and maximum counts are ignored; * these are presumed to be set in the positive pattern. * * @param pattern The localized pattern to be applied. * @param status Output param set to success/failure code on * exit. If the pattern is invalid, this will be * set to a failure result. * @stable */ virtual void applyLocalizedPattern(const UnicodeString& pattern, UParseError& parseError, UErrorCode& status); virtual void applyLocalizedPattern(const UnicodeString& pattern, UErrorCode& status); /** * Sets the maximum number of digits allowed in the integer portion of a * number. This override limits the integer digit count to 309. * @see NumberFormat#setMaximumIntegerDigits * @stable */ virtual void setMaximumIntegerDigits(int32_t newValue); /** * Sets the minimum number of digits allowed in the integer portion of a * number. This override limits the integer digit count to 309. * @see NumberFormat#setMinimumIntegerDigits * @stable */ virtual void setMinimumIntegerDigits(int32_t newValue); /** * Sets the maximum number of digits allowed in the fraction portion of a * number. This override limits the fraction digit count to 340. * @see NumberFormat#setMaximumFractionDigits * @stable */ virtual void setMaximumFractionDigits(int32_t newValue); /** * Sets the minimum number of digits allowed in the fraction portion of a * number. This override limits the fraction digit count to 340. * @see NumberFormat#setMinimumFractionDigits * @stable */ virtual void setMinimumFractionDigits(int32_t newValue); /** * The resource tags we use to retrieve decimal format data from * locale resource bundles. * @stable */ static const char *fgNumberPatterns; public: /** * Return the class ID for this class. This is useful only for * comparing to a return value from getDynamicClassID(). For example: *
     * .      Base* polymorphic_pointer = createPolymorphicObject();
     * .      if (polymorphic_pointer->getDynamicClassID() ==
     * .          Derived::getStaticClassID()) ...
     * 
* @return The class ID for all objects of this class. * @stable */ static UClassID getStaticClassID(void) { return (UClassID)&fgClassID; } /** * Returns a unique class ID POLYMORPHICALLY. Pure virtual override. * This method is to implement a simple version of RTTI, since not all * C++ compilers support genuine RTTI. Polymorphic operator==() and * clone() methods call this method. * * @return The class ID for this object. All objects of a * given class have the same class ID. Objects of * other classes have different class IDs. * @stable */ virtual UClassID getDynamicClassID(void) const { return getStaticClassID(); } private: static const char fgClassID; static UParseError fParseError; /** * Do real work of constructing a new DecimalFormat. */ void construct(UErrorCode& status, UParseError& parseErr, const UnicodeString* pattern = 0, DecimalFormatSymbols* symbolsToAdopt = 0, const Locale& locale = Locale::getDefault() ); /** * Does the real work of generating a pattern. */ UnicodeString& toPattern(UnicodeString& result, UBool localized) const; /** * Does the real work of applying a pattern. * @param pattern The pattern to be applied. * @param localized If true, the pattern is localized; else false. * @param parseError Struct to recieve information on position * of error if an error is encountered * @param status Output param set to success/failure code on * exit. If the pattern is invalid, this will be * set to a failure result. */ void applyPattern(const UnicodeString& pattern, UBool localized, UParseError& parseError, UErrorCode& status); /** * Do the work of formatting a number, either a double or a long. */ UnicodeString& subformat(UnicodeString& result, FieldPosition& fieldPosition, DigitList& digits, UBool isInteger) const; enum { fgStatusInfinite, fgStatusLength // Leave last in list. } StatusFlags; /** * Parse the given text into a number. The text is parsed beginning at * parsePosition, until an unparseable character is seen. * @param text The string to parse. * @param parsePosition The position at which to being parsing. Upon * return, the first unparseable character. * @param digits The DigitList to set to the parsed value. * @param isExponent If true, parse an exponent. This means no * infinite values and integer only. * @param status Upon return contains boolean status flags indicating * whether the value was infinite and whether it was positive. */ UBool subparse(const UnicodeString& text, ParsePosition& parsePosition, DigitList& digits, UBool* status) const; /** * Append an affix to the given StringBuffer, using quotes if * there are special characters. Single quotes themselves must be * escaped in either case. */ void appendAffix(UnicodeString& buffer, const UnicodeString& affix, UBool localized) const; void appendAffix(UnicodeString& buffer, const UnicodeString* affixPattern, const UnicodeString& expAffix, UBool localized) const; void expandAffix(const UnicodeString& pattern, UnicodeString& affix) const; void expandAffixes(void); static double round(double a, ERoundingMode mode, UBool isNegative); void addPadding(UnicodeString& result, FieldPosition& fieldPosition, UBool hasAffixes, UBool isNegative) const; UBool isGroupingPosition(int32_t pos) const; /** * Constants. */ //static const int8_t fgMaxDigit; // The largest digit, in this case 9 /*transient*/ //DigitList* fDigitList; UnicodeString fPositivePrefix; UnicodeString fPositiveSuffix; UnicodeString fNegativePrefix; UnicodeString fNegativeSuffix; UnicodeString* fPosPrefixPattern; UnicodeString* fPosSuffixPattern; UnicodeString* fNegPrefixPattern; UnicodeString* fNegSuffixPattern; int32_t fMultiplier; int32_t fGroupingSize; int32_t fGroupingSize2; UBool fDecimalSeparatorAlwaysShown; /*transient*/ UBool fIsCurrencyFormat; /* @deprecated */ DecimalFormatSymbols* fSymbols; UBool fUseExponentialNotation; int8_t fMinExponentDigits; UBool fExponentSignAlwaysShown; /* If fRoundingIncrement is NULL, there is no rounding. Otherwise, round to * fRoundingIncrement.getDouble(). Since this operation may be expensive, * we cache the result in fRoundingDouble. All methods that update * fRoundingIncrement also update fRoundingDouble. */ DigitList* fRoundingIncrement; /*transient*/ double fRoundingDouble; ERoundingMode fRoundingMode; UnicodeString fPad; int32_t fFormatWidth; EPadPosition fPadPosition; // Constants for characters used in programmatic (unlocalized) patterns. static const UChar kPatternZeroDigit; static const UChar kPatternGroupingSeparator; static const UChar kPatternDecimalSeparator; static const UChar kPatternPerMill; static const UChar kPatternPercent; static const UChar kPatternDigit; static const UChar kPatternSeparator; static const UChar kPatternExponent; static const UChar kPatternPlus; static const UChar kPatternMinus; static const UChar kPatternPadEscape; /** * The CURRENCY_SIGN is the standard Unicode symbol for currency. It * is used in patterns and substitued with either the currency symbol, * or if it is doubled, with the international currency symbol. If the * CURRENCY_SIGN is seen in a pattern, then the decimal separator is * replaced with the monetary decimal separator. */ static const UChar kCurrencySign; static const UChar kQuote; protected: static const int32_t kDoubleIntegerDigits; static const int32_t kDoubleFractionDigits; }; inline UnicodeString& DecimalFormat::format(const Formattable& obj, UnicodeString& result, UErrorCode& status) const { // Don't use Format:: - use immediate base class only, // in case immediate base modifies behavior later. return NumberFormat::format(obj, result, status); } inline UnicodeString& DecimalFormat::format(double number, UnicodeString& output) const { FieldPosition pos(0); return format(number, output, pos); } inline UnicodeString& DecimalFormat::format(int32_t number, UnicodeString& output) const { FieldPosition pos(0); return format(number, output, pos); } inline UChar DecimalFormat::getPadCharacter() { return getPadCharacterString().charAt(0); } inline void DecimalFormat::setPadCharacter(UChar padChar) { setPadCharacter(UnicodeString(padChar)); } #endif // _DECIMFMT //eof