Home | History | Annotate | Download | only in i18n
      1 //  2016 and later: Unicode, Inc. and others.
      2 // License & terms of use: http://www.unicode.org/copyright.html
      3 /*
      4 *******************************************************************************
      5 * Copyright (C) 2015, International Business Machines
      6 * Corporation and others.  All Rights Reserved.
      7 *******************************************************************************
      8 * digitformatter.h
      9 *
     10 * created on: 2015jan06
     11 * created by: Travis Keep
     12 */
     13 
     14 #ifndef __DIGITFORMATTER_H__
     15 #define __DIGITFORMATTER_H__
     16 
     17 #include "unicode/uobject.h"
     18 
     19 #if !UCONFIG_NO_FORMATTING
     20 
     21 #include "unicode/utypes.h"
     22 #include "unicode/unistr.h"
     23 #include "digitaffix.h"
     24 
     25 U_NAMESPACE_BEGIN
     26 
     27 class DecimalFormatSymbols;
     28 class DigitList;
     29 class DigitGrouping;
     30 class DigitInterval;
     31 class UnicodeString;
     32 class FieldPositionHandler;
     33 class IntDigitCountRange;
     34 class VisibleDigits;
     35 class VisibleDigitsWithExponent;
     36 
     37 /**
     38  * Various options for formatting in fixed point.
     39  */
     40 class U_I18N_API DigitFormatterOptions : public UMemory {
     41     public:
     42     DigitFormatterOptions() : fAlwaysShowDecimal(FALSE) { }
     43 
     44     /**
     45      * Returns TRUE if this object equals rhs.
     46      */
     47     UBool equals(const DigitFormatterOptions &rhs) const {
     48         return (
     49             fAlwaysShowDecimal == rhs.fAlwaysShowDecimal);
     50     }
     51 
     52     /**
     53      * Returns TRUE if these options allow for fast formatting of
     54      * integers.
     55      */
     56     UBool isFastFormattable() const {
     57         return (fAlwaysShowDecimal == FALSE);
     58     }
     59 
     60     /**
     61      * If TRUE, show the decimal separator even when there are no fraction
     62      * digits. default is FALSE.
     63      */
     64     UBool fAlwaysShowDecimal;
     65 };
     66 
     67 /**
     68  * Various options for formatting an integer.
     69  */
     70 class U_I18N_API DigitFormatterIntOptions : public UMemory {
     71     public:
     72     DigitFormatterIntOptions() : fAlwaysShowSign(FALSE) { }
     73 
     74     /**
     75      * Returns TRUE if this object equals rhs.
     76      */
     77     UBool equals(const DigitFormatterIntOptions &rhs) const {
     78         return (fAlwaysShowSign == rhs.fAlwaysShowSign);
     79     }
     80 
     81     /**
     82      * If TRUE, always prefix the integer with its sign even if the number is
     83      * positive. Default is FALSE.
     84      */
     85     UBool fAlwaysShowSign;
     86 };
     87 
     88 /**
     89  * Options for formatting in scientific notation.
     90  */
     91 class U_I18N_API SciFormatterOptions : public UMemory {
     92     public:
     93 
     94     /**
     95      * Returns TRUE if this object equals rhs.
     96      */
     97     UBool equals(const SciFormatterOptions &rhs) const {
     98         return (fMantissa.equals(rhs.fMantissa) &&
     99                 fExponent.equals(rhs.fExponent));
    100     }
    101 
    102     /**
    103      * Options for formatting the mantissa.
    104      */
    105     DigitFormatterOptions fMantissa;
    106 
    107     /**
    108      * Options for formatting the exponent.
    109      */
    110     DigitFormatterIntOptions fExponent;
    111 };
    112 
    113 
    114 /**
    115  * Does fixed point formatting.
    116  *
    117  * This class only does fixed point formatting. It does no rounding before
    118  * formatting.
    119  */
    120 class U_I18N_API DigitFormatter : public UMemory {
    121 public:
    122 
    123 /**
    124  * Decimal separator is period (.), Plus sign is plus (+),
    125  * minus sign is minus (-), grouping separator is comma (,), digits are 0-9.
    126  */
    127 DigitFormatter();
    128 
    129 /**
    130  * Let symbols determine the digits, decimal separator,
    131  * plus and mius sign, grouping separator, and possibly other settings.
    132  */
    133 DigitFormatter(const DecimalFormatSymbols &symbols);
    134 
    135 /**
    136  * Change what this instance uses for digits, decimal separator,
    137  * plus and mius sign, grouping separator, and possibly other settings
    138  * according to symbols.
    139  */
    140 void setDecimalFormatSymbols(const DecimalFormatSymbols &symbols);
    141 
    142 /**
    143  * Change what this instance uses for digits, decimal separator,
    144  * plus and mius sign, grouping separator, and possibly other settings
    145  * according to symbols in the context of monetary amounts.
    146  */
    147 void setDecimalFormatSymbolsForMonetary(const DecimalFormatSymbols &symbols);
    148 
    149 /**
    150  * Fixed point formatting.
    151  *
    152  * @param positiveDigits the value to format
    153  *  Negative sign can be present, but it won't show.
    154  * @param grouping controls how digit grouping is done
    155  * @param options formatting options
    156  * @param handler records field positions
    157  * @param appendTo formatted value appended here.
    158  * @return appendTo
    159  */
    160 UnicodeString &format(
    161         const VisibleDigits &positiveDigits,
    162         const DigitGrouping &grouping,
    163         const DigitFormatterOptions &options,
    164         FieldPositionHandler &handler,
    165         UnicodeString &appendTo) const;
    166 
    167 /**
    168  * formats in scientifc notation.
    169  * @param positiveDigits the value to format.
    170  *  Negative sign can be present, but it won't show.
    171  * @param options formatting options
    172  * @param handler records field positions.
    173  * @param appendTo formatted value appended here.
    174  */
    175 UnicodeString &format(
    176         const VisibleDigitsWithExponent &positiveDigits,
    177         const SciFormatterOptions &options,
    178         FieldPositionHandler &handler,
    179         UnicodeString &appendTo) const;
    180 
    181 /**
    182  * Fixed point formatting of integers.
    183  * Always performed with no grouping and no decimal point.
    184  *
    185  * @param positiveValue the value to format must be positive.
    186  * @param range specifies minimum and maximum number of digits.
    187  * @param handler records field positions
    188  * @param appendTo formatted value appended here.
    189  * @return appendTo
    190  */
    191 UnicodeString &formatPositiveInt32(
    192         int32_t positiveValue,
    193         const IntDigitCountRange &range,
    194         FieldPositionHandler &handler,
    195         UnicodeString &appendTo) const;
    196 
    197 /**
    198  * Counts how many code points are needed for fixed formatting.
    199  *   If digits is negative, the negative sign is not included in the count.
    200  */
    201 int32_t countChar32(
    202         const VisibleDigits &digits,
    203         const DigitGrouping &grouping,
    204         const DigitFormatterOptions &options) const;
    205 
    206 /**
    207  * Counts how many code points are needed for scientific formatting.
    208  *   If digits is negative, the negative sign is not included in the count.
    209  */
    210 int32_t countChar32(
    211         const VisibleDigitsWithExponent &digits,
    212         const SciFormatterOptions &options) const;
    213 
    214 /**
    215  * Returns TRUE if this object equals rhs.
    216  */
    217 UBool equals(const DigitFormatter &rhs) const;
    218 
    219 private:
    220 UChar32 fLocalizedDigits[10];
    221 UnicodeString fGroupingSeparator;
    222 UnicodeString fDecimal;
    223 UnicodeString fNegativeSign;
    224 UnicodeString fPositiveSign;
    225 DigitAffix fInfinity;
    226 DigitAffix fNan;
    227 UBool fIsStandardDigits;
    228 UnicodeString fExponent;
    229 UBool isStandardDigits() const;
    230 
    231 UnicodeString &formatDigits(
    232         const uint8_t *digits,
    233         int32_t count,
    234         const IntDigitCountRange &range,
    235         int32_t intField,
    236         FieldPositionHandler &handler,
    237         UnicodeString &appendTo) const;
    238 
    239 void setOtherDecimalFormatSymbols(const DecimalFormatSymbols &symbols);
    240 
    241 int32_t countChar32(
    242         const VisibleDigits &exponent,
    243         const DigitInterval &mantissaInterval,
    244         const SciFormatterOptions &options) const;
    245 
    246 UnicodeString &formatNaN(
    247         FieldPositionHandler &handler,
    248         UnicodeString &appendTo) const {
    249     return fNan.format(handler, appendTo);
    250 }
    251 
    252 int32_t countChar32ForNaN() const {
    253     return fNan.toString().countChar32();
    254 }
    255 
    256 UnicodeString &formatInfinity(
    257         FieldPositionHandler &handler,
    258         UnicodeString &appendTo) const {
    259     return fInfinity.format(handler, appendTo);
    260 }
    261 
    262 int32_t countChar32ForInfinity() const {
    263     return fInfinity.toString().countChar32();
    264 }
    265 
    266 UnicodeString &formatExponent(
    267         const VisibleDigits &digits,
    268         const DigitFormatterIntOptions &options,
    269         int32_t signField,
    270         int32_t intField,
    271         FieldPositionHandler &handler,
    272         UnicodeString &appendTo) const;
    273 
    274 int32_t countChar32(
    275         const DigitGrouping &grouping,
    276         const DigitInterval &interval,
    277         const DigitFormatterOptions &options) const;
    278 
    279 int32_t countChar32ForExponent(
    280         const VisibleDigits &exponent,
    281         const DigitFormatterIntOptions &options) const;
    282 
    283 };
    284 
    285 
    286 U_NAMESPACE_END
    287 #endif /* #if !UCONFIG_NO_FORMATTING */
    288 #endif  // __DIGITFORMATTER_H__
    289