Home | History | Annotate | Download | only in i18n
      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