/* ******************************************************************************** * Copyright (C) 1997-1999, 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:] *

 * .    // 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;  
 * .            }
 * .        }
 * .    }
 * 
* [The following shows the structure of the pattern.] *
 * .    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
 * 
* 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. *

 * .    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.
 * 
* [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 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. * * @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. * @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 * @stable */ 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 */ 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 */ 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 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, 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 char fgClassID; /** * Do real work of constructing a new DecimalFormat. */ void construct(UErrorCode& status, 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 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, UErrorCode& status); /** * Do the work of formatting a number, either a double or a long. */ UnicodeString& subformat(UnicodeString& result, FieldPosition& fieldPosition, UBool isNegative, UBool isInteger) const; static const int32_t fgStatusInfinite; static const int32_t fgStatusPositive; static const int32_t fgStatusLength; /** * 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 isExponent, 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, 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; 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; UChar 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 { return NumberFormat::format(number, output); } inline UnicodeString& DecimalFormat::format(int32_t number, UnicodeString& output) const { return NumberFormat::format(number, output); } inline UChar DecimalFormat::getPadCharacter() { return getPadCharacterString().charAt(0); } inline void DecimalFormat::setPadCharacter(UChar padChar) { setPadCharacter(UnicodeString(padChar)); } #endif // _DECIMFMT //eof