1 /* 2 ******************************************************************************* 3 * Copyright (C) 2015, International Business Machines 4 * Corporation and others. All Rights Reserved. 5 ******************************************************************************* 6 * digitaffixesandpadding.h 7 * 8 * created on: 2015jan06 9 * created by: Travis Keep 10 */ 11 12 #ifndef __DIGITAFFIXESANDPADDING_H__ 13 #define __DIGITAFFIXESANDPADDING_H__ 14 15 #include "unicode/utypes.h" 16 17 #if !UCONFIG_NO_FORMATTING 18 19 #include "unicode/uobject.h" 20 #include "pluralaffix.h" 21 22 U_NAMESPACE_BEGIN 23 24 class DigitList; 25 class ValueFormatter; 26 class UnicodeString; 27 class FieldPositionHandler; 28 class PluralRules; 29 class VisibleDigitsWithExponent; 30 31 /** 32 * A formatter of numbers. This class can format any numerical value 33 * except for not a number (NaN), positive infinity, and negative infinity. 34 * This class manages prefixes, suffixes, and padding but delegates the 35 * formatting of actual positive values to a ValueFormatter. 36 */ 37 class U_I18N_API DigitAffixesAndPadding : public UMemory { 38 public: 39 40 /** 41 * Equivalent to DecimalFormat EPadPosition, but redeclared here to prevent 42 * depending on DecimalFormat which would cause a circular dependency. 43 */ 44 enum EPadPosition { 45 kPadBeforePrefix, 46 kPadAfterPrefix, 47 kPadBeforeSuffix, 48 kPadAfterSuffix 49 }; 50 51 /** 52 * The positive prefix 53 */ 54 PluralAffix fPositivePrefix; 55 56 /** 57 * The positive suffix 58 */ 59 PluralAffix fPositiveSuffix; 60 61 /** 62 * The negative suffix 63 */ 64 PluralAffix fNegativePrefix; 65 66 /** 67 * The negative suffix 68 */ 69 PluralAffix fNegativeSuffix; 70 71 /** 72 * The padding position 73 */ 74 EPadPosition fPadPosition; 75 76 /** 77 * The padding character. 78 */ 79 UChar32 fPadChar; 80 81 /** 82 * The field width in code points. The format method inserts instances of 83 * the padding character as needed in the desired padding position so that 84 * the entire formatted string contains this many code points. If the 85 * formatted string already exceeds this many code points, the format method 86 * inserts no padding. 87 */ 88 int32_t fWidth; 89 90 /** 91 * Pad position is before prefix; padding character is '*' field width is 0. 92 * The affixes are all the empty string with no annotated fields with just 93 * the 'other' plural variation. 94 */ 95 DigitAffixesAndPadding() 96 : fPadPosition(kPadBeforePrefix), fPadChar(0x2a), fWidth(0) { } 97 98 /** 99 * Returns TRUE if this object is equal to rhs. 100 */ 101 UBool equals(const DigitAffixesAndPadding &rhs) const { 102 return (fPositivePrefix.equals(rhs.fPositivePrefix) && 103 fPositiveSuffix.equals(rhs.fPositiveSuffix) && 104 fNegativePrefix.equals(rhs.fNegativePrefix) && 105 fNegativeSuffix.equals(rhs.fNegativeSuffix) && 106 fPadPosition == rhs.fPadPosition && 107 fWidth == rhs.fWidth && 108 fPadChar == rhs.fPadChar); 109 } 110 111 /** 112 * Returns TRUE if a plural rules instance is needed to complete the 113 * formatting by detecting if any of the affixes have multiple plural 114 * variations. 115 */ 116 UBool needsPluralRules() const; 117 118 /** 119 * Formats value and appends to appendTo. 120 * 121 * @param value the value to format. May be NaN or ininite. 122 * @param formatter handles the details of formatting the actual value. 123 * @param handler records field positions 124 * @param optPluralRules the plural rules, but may be NULL if 125 * needsPluralRules returns FALSE. 126 * @appendTo formatted string appended here. 127 * @status any error returned here. 128 */ 129 UnicodeString &format( 130 const VisibleDigitsWithExponent &value, 131 const ValueFormatter &formatter, 132 FieldPositionHandler &handler, 133 const PluralRules *optPluralRules, 134 UnicodeString &appendTo, 135 UErrorCode &status) const; 136 137 /** 138 * For testing only. 139 */ 140 UnicodeString &format( 141 DigitList &value, 142 const ValueFormatter &formatter, 143 FieldPositionHandler &handler, 144 const PluralRules *optPluralRules, 145 UnicodeString &appendTo, 146 UErrorCode &status) const; 147 148 /** 149 * Formats a 32-bit integer and appends to appendTo. When formatting an 150 * integer, this method is preferred to plain format as it can run 151 * several times faster under certain conditions. 152 * 153 * @param value the value to format. 154 * @param formatter handles the details of formatting the actual value. 155 * @param handler records field positions 156 * @param optPluralRules the plural rules, but may be NULL if 157 * needsPluralRules returns FALSE. 158 * @appendTo formatted string appended here. 159 * @status any error returned here. 160 */ 161 UnicodeString &formatInt32( 162 int32_t value, 163 const ValueFormatter &formatter, 164 FieldPositionHandler &handler, 165 const PluralRules *optPluralRules, 166 UnicodeString &appendTo, 167 UErrorCode &status) const; 168 169 private: 170 UnicodeString &appendPadding(int32_t paddingCount, UnicodeString &appendTo) const; 171 172 }; 173 174 175 U_NAMESPACE_END 176 #endif /* #if !UCONFIG_NO_FORMATTING */ 177 #endif // __DIGITAFFIXANDPADDING_H__ 178