/*
*******************************************************************************
* Copyright (C) 2015, International Business Machines
* Corporation and others. All Rights Reserved.
*******************************************************************************
* digitaffixesandpadding.h
*
* created on: 2015jan06
* created by: Travis Keep
*/
#ifndef __DIGITAFFIXESANDPADDING_H__
#define __DIGITAFFIXESANDPADDING_H__
#include "unicode/utypes.h"
#if !UCONFIG_NO_FORMATTING
#include "unicode/uobject.h"
#include "pluralaffix.h"
U_NAMESPACE_BEGIN
class DigitList;
class ValueFormatter;
class UnicodeString;
class FieldPositionHandler;
class PluralRules;
class VisibleDigitsWithExponent;
/**
* A formatter of numbers. This class can format any numerical value
* except for not a number (NaN), positive infinity, and negative infinity.
* This class manages prefixes, suffixes, and padding but delegates the
* formatting of actual positive values to a ValueFormatter.
*/
class U_I18N_API DigitAffixesAndPadding : public UMemory {
public:
/**
* Equivalent to DecimalFormat EPadPosition, but redeclared here to prevent
* depending on DecimalFormat which would cause a circular dependency.
*/
enum EPadPosition {
kPadBeforePrefix,
kPadAfterPrefix,
kPadBeforeSuffix,
kPadAfterSuffix
};
/**
* The positive prefix
*/
PluralAffix fPositivePrefix;
/**
* The positive suffix
*/
PluralAffix fPositiveSuffix;
/**
* The negative suffix
*/
PluralAffix fNegativePrefix;
/**
* The negative suffix
*/
PluralAffix fNegativeSuffix;
/**
* The padding position
*/
EPadPosition fPadPosition;
/**
* The padding character.
*/
UChar32 fPadChar;
/**
* The field width in code points. The format method inserts instances of
* the padding character as needed in the desired padding position so that
* the entire formatted string contains this many code points. If the
* formatted string already exceeds this many code points, the format method
* inserts no padding.
*/
int32_t fWidth;
/**
* Pad position is before prefix; padding character is '*' field width is 0.
* The affixes are all the empty string with no annotated fields with just
* the 'other' plural variation.
*/
DigitAffixesAndPadding()
: fPadPosition(kPadBeforePrefix), fPadChar(0x2a), fWidth(0) { }
/**
* Returns TRUE if this object is equal to rhs.
*/
UBool equals(const DigitAffixesAndPadding &rhs) const {
return (fPositivePrefix.equals(rhs.fPositivePrefix) &&
fPositiveSuffix.equals(rhs.fPositiveSuffix) &&
fNegativePrefix.equals(rhs.fNegativePrefix) &&
fNegativeSuffix.equals(rhs.fNegativeSuffix) &&
fPadPosition == rhs.fPadPosition &&
fWidth == rhs.fWidth &&
fPadChar == rhs.fPadChar);
}
/**
* Returns TRUE if a plural rules instance is needed to complete the
* formatting by detecting if any of the affixes have multiple plural
* variations.
*/
UBool needsPluralRules() const;
/**
* Formats value and appends to appendTo.
*
* @param value the value to format. May be NaN or ininite.
* @param formatter handles the details of formatting the actual value.
* @param handler records field positions
* @param optPluralRules the plural rules, but may be NULL if
* needsPluralRules returns FALSE.
* @appendTo formatted string appended here.
* @status any error returned here.
*/
UnicodeString &format(
const VisibleDigitsWithExponent &value,
const ValueFormatter &formatter,
FieldPositionHandler &handler,
const PluralRules *optPluralRules,
UnicodeString &appendTo,
UErrorCode &status) const;
/**
* For testing only.
*/
UnicodeString &format(
DigitList &value,
const ValueFormatter &formatter,
FieldPositionHandler &handler,
const PluralRules *optPluralRules,
UnicodeString &appendTo,
UErrorCode &status) const;
/**
* Formats a 32-bit integer and appends to appendTo. When formatting an
* integer, this method is preferred to plain format as it can run
* several times faster under certain conditions.
*
* @param value the value to format.
* @param formatter handles the details of formatting the actual value.
* @param handler records field positions
* @param optPluralRules the plural rules, but may be NULL if
* needsPluralRules returns FALSE.
* @appendTo formatted string appended here.
* @status any error returned here.
*/
UnicodeString &formatInt32(
int32_t value,
const ValueFormatter &formatter,
FieldPositionHandler &handler,
const PluralRules *optPluralRules,
UnicodeString &appendTo,
UErrorCode &status) const;
private:
UnicodeString &appendPadding(int32_t paddingCount, UnicodeString &appendTo) const;
};
U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_FORMATTING */
#endif // __DIGITAFFIXANDPADDING_H__