#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;
class U_I18N_API DigitFormatterOptions : public UMemory {
public:
DigitFormatterOptions() : fAlwaysShowDecimal(FALSE) { }
UBool equals(const DigitFormatterOptions &rhs) const {
return (
fAlwaysShowDecimal == rhs.fAlwaysShowDecimal);
}
UBool isFastFormattable() const {
return (fAlwaysShowDecimal == FALSE);
}
UBool fAlwaysShowDecimal;
};
class U_I18N_API DigitFormatterIntOptions : public UMemory {
public:
DigitFormatterIntOptions() : fAlwaysShowSign(FALSE) { }
UBool equals(const DigitFormatterIntOptions &rhs) const {
return (fAlwaysShowSign == rhs.fAlwaysShowSign);
}
UBool fAlwaysShowSign;
};
class U_I18N_API SciFormatterOptions : public UMemory {
public:
UBool equals(const SciFormatterOptions &rhs) const {
return (fMantissa.equals(rhs.fMantissa) &&
fExponent.equals(rhs.fExponent));
}
DigitFormatterOptions fMantissa;
DigitFormatterIntOptions fExponent;
};
class U_I18N_API DigitFormatter : public UMemory {
public:
DigitFormatter();
DigitFormatter(const DecimalFormatSymbols &symbols);
void setDecimalFormatSymbols(const DecimalFormatSymbols &symbols);
void setDecimalFormatSymbolsForMonetary(const DecimalFormatSymbols &symbols);
UnicodeString &format(
const VisibleDigits &positiveDigits,
const DigitGrouping &grouping,
const DigitFormatterOptions &options,
FieldPositionHandler &handler,
UnicodeString &appendTo) const;
UnicodeString &format(
const VisibleDigitsWithExponent &positiveDigits,
const SciFormatterOptions &options,
FieldPositionHandler &handler,
UnicodeString &appendTo) const;
UnicodeString &formatPositiveInt32(
int32_t positiveValue,
const IntDigitCountRange &range,
FieldPositionHandler &handler,
UnicodeString &appendTo) const;
int32_t countChar32(
const VisibleDigits &digits,
const DigitGrouping &grouping,
const DigitFormatterOptions &options) const;
int32_t countChar32(
const VisibleDigitsWithExponent &digits,
const SciFormatterOptions &options) const;
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
#endif // __DIGITFORMATTER_H__