/*
*******************************************************************************
* 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__