| Index: source/i18n/digitformatter.h
 | 
| diff --git a/source/i18n/digitformatter.h b/source/i18n/digitformatter.h
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..cf339f598d627e945fa22e739174a19c874ca5e1
 | 
| --- /dev/null
 | 
| +++ b/source/i18n/digitformatter.h
 | 
| @@ -0,0 +1,286 @@
 | 
| +/*
 | 
| +*******************************************************************************
 | 
| +* Copyright (C) 2015, International Business Machines
 | 
| +* Corporation and others.  All Rights Reserved.
 | 
| +*******************************************************************************
 | 
| +* digitformatter.h
 | 
| +*
 | 
| +* created on: 2015jan06
 | 
| +* created by: Travis Keep
 | 
| +*/
 | 
| +
 | 
| +#ifndef __DIGITFORMATTER_H__
 | 
| +#define __DIGITFORMATTER_H__
 | 
| +
 | 
| +#include "unicode/uobject.h"
 | 
| +
 | 
| +#if !UCONFIG_NO_FORMATTING
 | 
| +
 | 
| +#include "unicode/utypes.h"
 | 
| +#include "unicode/unistr.h"
 | 
| +#include "digitaffix.h"
 | 
| +
 | 
| +U_NAMESPACE_BEGIN
 | 
| +
 | 
| +class DecimalFormatSymbols;
 | 
| +class DigitList;
 | 
| +class DigitGrouping;
 | 
| +class DigitInterval;
 | 
| +class UnicodeString;
 | 
| +class FieldPositionHandler;
 | 
| +class IntDigitCountRange;
 | 
| +class VisibleDigits;
 | 
| +class VisibleDigitsWithExponent;
 | 
| +
 | 
| +/**
 | 
| + * Various options for formatting in fixed point.
 | 
| + */
 | 
| +class U_I18N_API DigitFormatterOptions : public UMemory {
 | 
| +    public:
 | 
| +    DigitFormatterOptions() : fAlwaysShowDecimal(FALSE) { }
 | 
| +
 | 
| +    /**
 | 
| +     * Returns TRUE if this object equals rhs.
 | 
| +     */
 | 
| +    UBool equals(const DigitFormatterOptions &rhs) const {
 | 
| +        return (
 | 
| +            fAlwaysShowDecimal == rhs.fAlwaysShowDecimal);
 | 
| +    }
 | 
| +
 | 
| +    /**
 | 
| +     * Returns TRUE if these options allow for fast formatting of
 | 
| +     * integers.
 | 
| +     */
 | 
| +    UBool isFastFormattable() const {
 | 
| +        return (fAlwaysShowDecimal == FALSE);
 | 
| +    }
 | 
| +
 | 
| +    /**
 | 
| +     * If TRUE, show the decimal separator even when there are no fraction
 | 
| +     * digits. default is FALSE.
 | 
| +     */
 | 
| +    UBool fAlwaysShowDecimal;
 | 
| +};
 | 
| +
 | 
| +/**
 | 
| + * Various options for formatting an integer.
 | 
| + */
 | 
| +class U_I18N_API DigitFormatterIntOptions : public UMemory {
 | 
| +    public:
 | 
| +    DigitFormatterIntOptions() : fAlwaysShowSign(FALSE) { }
 | 
| +
 | 
| +    /**
 | 
| +     * Returns TRUE if this object equals rhs.
 | 
| +     */
 | 
| +    UBool equals(const DigitFormatterIntOptions &rhs) const {
 | 
| +        return (fAlwaysShowSign == rhs.fAlwaysShowSign);
 | 
| +    }
 | 
| +
 | 
| +    /**
 | 
| +     * If TRUE, always prefix the integer with its sign even if the number is
 | 
| +     * positive. Default is FALSE.
 | 
| +     */
 | 
| +    UBool fAlwaysShowSign;
 | 
| +};
 | 
| +
 | 
| +/**
 | 
| + * Options for formatting in scientific notation.
 | 
| + */
 | 
| +class U_I18N_API SciFormatterOptions : public UMemory {
 | 
| +    public:
 | 
| +
 | 
| +    /**
 | 
| +     * Returns TRUE if this object equals rhs.
 | 
| +     */
 | 
| +    UBool equals(const SciFormatterOptions &rhs) const {
 | 
| +        return (fMantissa.equals(rhs.fMantissa) &&
 | 
| +                fExponent.equals(rhs.fExponent));
 | 
| +    }
 | 
| +
 | 
| +    /**
 | 
| +     * Options for formatting the mantissa.
 | 
| +     */
 | 
| +    DigitFormatterOptions fMantissa;
 | 
| +
 | 
| +    /**
 | 
| +     * Options for formatting the exponent.
 | 
| +     */
 | 
| +    DigitFormatterIntOptions fExponent;
 | 
| +};
 | 
| +
 | 
| +
 | 
| +/**
 | 
| + * Does fixed point formatting.
 | 
| + *
 | 
| + * This class only does fixed point formatting. It does no rounding before
 | 
| + * formatting.
 | 
| + */
 | 
| +class U_I18N_API DigitFormatter : public UMemory {
 | 
| +public:
 | 
| +
 | 
| +/**
 | 
| + * Decimal separator is period (.), Plus sign is plus (+),
 | 
| + * minus sign is minus (-), grouping separator is comma (,), digits are 0-9.
 | 
| + */
 | 
| +DigitFormatter();
 | 
| +
 | 
| +/**
 | 
| + * Let symbols determine the digits, decimal separator,
 | 
| + * plus and mius sign, grouping separator, and possibly other settings.
 | 
| + */
 | 
| +DigitFormatter(const DecimalFormatSymbols &symbols);
 | 
| +
 | 
| +/**
 | 
| + * Change what this instance uses for digits, decimal separator,
 | 
| + * plus and mius sign, grouping separator, and possibly other settings
 | 
| + * according to symbols.
 | 
| + */
 | 
| +void setDecimalFormatSymbols(const DecimalFormatSymbols &symbols);
 | 
| +
 | 
| +/**
 | 
| + * Change what this instance uses for digits, decimal separator,
 | 
| + * plus and mius sign, grouping separator, and possibly other settings
 | 
| + * according to symbols in the context of monetary amounts.
 | 
| + */
 | 
| +void setDecimalFormatSymbolsForMonetary(const DecimalFormatSymbols &symbols);
 | 
| +
 | 
| +/**
 | 
| + * Fixed point formatting.
 | 
| + *
 | 
| + * @param positiveDigits the value to format
 | 
| + *  Negative sign can be present, but it won't show.
 | 
| + * @param grouping controls how digit grouping is done
 | 
| + * @param options formatting options
 | 
| + * @param handler records field positions
 | 
| + * @param appendTo formatted value appended here.
 | 
| + * @return appendTo
 | 
| + */
 | 
| +UnicodeString &format(
 | 
| +        const VisibleDigits &positiveDigits,
 | 
| +        const DigitGrouping &grouping,
 | 
| +        const DigitFormatterOptions &options,
 | 
| +        FieldPositionHandler &handler,
 | 
| +        UnicodeString &appendTo) const;
 | 
| +
 | 
| +/**
 | 
| + * formats in scientifc notation.
 | 
| + * @param positiveDigits the value to format.
 | 
| + *  Negative sign can be present, but it won't show.
 | 
| + * @param options formatting options
 | 
| + * @param handler records field positions.
 | 
| + * @param appendTo formatted value appended here.
 | 
| + */
 | 
| +UnicodeString &format(
 | 
| +        const VisibleDigitsWithExponent &positiveDigits,
 | 
| +        const SciFormatterOptions &options,
 | 
| +        FieldPositionHandler &handler,
 | 
| +        UnicodeString &appendTo) const;
 | 
| +
 | 
| +/**
 | 
| + * Fixed point formatting of integers.
 | 
| + * Always performed with no grouping and no decimal point.
 | 
| + *
 | 
| + * @param positiveValue the value to format must be positive.
 | 
| + * @param range specifies minimum and maximum number of digits.
 | 
| + * @param handler records field positions
 | 
| + * @param appendTo formatted value appended here.
 | 
| + * @return appendTo
 | 
| + */
 | 
| +UnicodeString &formatPositiveInt32(
 | 
| +        int32_t positiveValue,
 | 
| +        const IntDigitCountRange &range,
 | 
| +        FieldPositionHandler &handler,
 | 
| +        UnicodeString &appendTo) const;
 | 
| +
 | 
| +/**
 | 
| + * Counts how many code points are needed for fixed formatting.
 | 
| + *   If digits is negative, the negative sign is not included in the count.
 | 
| + */
 | 
| +int32_t countChar32(
 | 
| +        const VisibleDigits &digits,
 | 
| +        const DigitGrouping &grouping,
 | 
| +        const DigitFormatterOptions &options) const;
 | 
| +
 | 
| +/**
 | 
| + * Counts how many code points are needed for scientific formatting.
 | 
| + *   If digits is negative, the negative sign is not included in the count.
 | 
| + */
 | 
| +int32_t countChar32(
 | 
| +        const VisibleDigitsWithExponent &digits,
 | 
| +        const SciFormatterOptions &options) const;
 | 
| +
 | 
| +/**
 | 
| + * Returns TRUE if this object equals rhs.
 | 
| + */
 | 
| +UBool equals(const DigitFormatter &rhs) const;
 | 
| +
 | 
| +private:
 | 
| +UChar32 fLocalizedDigits[10];
 | 
| +UnicodeString fGroupingSeparator;
 | 
| +UnicodeString fDecimal;
 | 
| +UnicodeString fNegativeSign;
 | 
| +UnicodeString fPositiveSign;
 | 
| +DigitAffix fInfinity;
 | 
| +DigitAffix fNan;
 | 
| +UBool fIsStandardDigits;
 | 
| +UnicodeString fExponent;
 | 
| +UBool isStandardDigits() const;
 | 
| +
 | 
| +UnicodeString &formatDigits(
 | 
| +        const uint8_t *digits,
 | 
| +        int32_t count,
 | 
| +        const IntDigitCountRange &range,
 | 
| +        int32_t intField,
 | 
| +        FieldPositionHandler &handler,
 | 
| +        UnicodeString &appendTo) const;
 | 
| +
 | 
| +void setOtherDecimalFormatSymbols(const DecimalFormatSymbols &symbols);
 | 
| +
 | 
| +int32_t countChar32(
 | 
| +        const VisibleDigits &exponent,
 | 
| +        const DigitInterval &mantissaInterval,
 | 
| +        const SciFormatterOptions &options) const;
 | 
| +
 | 
| +UnicodeString &formatNaN(
 | 
| +        FieldPositionHandler &handler,
 | 
| +        UnicodeString &appendTo) const {
 | 
| +    return fNan.format(handler, appendTo);
 | 
| +}
 | 
| +
 | 
| +int32_t countChar32ForNaN() const {
 | 
| +    return fNan.toString().countChar32();
 | 
| +}
 | 
| +
 | 
| +UnicodeString &formatInfinity(
 | 
| +        FieldPositionHandler &handler,
 | 
| +        UnicodeString &appendTo) const {
 | 
| +    return fInfinity.format(handler, appendTo);
 | 
| +}
 | 
| +
 | 
| +int32_t countChar32ForInfinity() const {
 | 
| +    return fInfinity.toString().countChar32();
 | 
| +}
 | 
| +
 | 
| +UnicodeString &formatExponent(
 | 
| +        const VisibleDigits &digits,
 | 
| +        const DigitFormatterIntOptions &options,
 | 
| +        int32_t signField,
 | 
| +        int32_t intField,
 | 
| +        FieldPositionHandler &handler,
 | 
| +        UnicodeString &appendTo) const;
 | 
| +
 | 
| +int32_t countChar32(
 | 
| +        const DigitGrouping &grouping,
 | 
| +        const DigitInterval &interval,
 | 
| +        const DigitFormatterOptions &options) const;
 | 
| +
 | 
| +int32_t countChar32ForExponent(
 | 
| +        const VisibleDigits &exponent,
 | 
| +        const DigitFormatterIntOptions &options) const;
 | 
| +
 | 
| +};
 | 
| +
 | 
| +
 | 
| +U_NAMESPACE_END
 | 
| +#endif /* #if !UCONFIG_NO_FORMATTING */
 | 
| +#endif  // __DIGITFORMATTER_H__
 | 
| 
 |