Home | History | Annotate | Download | only in i18n
      1 /*
      2 ******************************************************************************
      3 * Copyright (C) 2014-2015, International Business Machines
      4 * Corporation and others.  All Rights Reserved.
      5 ******************************************************************************
      6 * quantityformatter.h
      7 */
      8 
      9 #ifndef __QUANTITY_FORMATTER_H__
     10 #define __QUANTITY_FORMATTER_H__
     11 
     12 #include "unicode/utypes.h"
     13 #include "unicode/uobject.h"
     14 
     15 #if !UCONFIG_NO_FORMATTING
     16 
     17 #include "standardplural.h"
     18 
     19 U_NAMESPACE_BEGIN
     20 
     21 class SimplePatternFormatter;
     22 class UnicodeString;
     23 class PluralRules;
     24 class NumberFormat;
     25 class Formattable;
     26 class FieldPosition;
     27 
     28 /**
     29  * A plural aware formatter that is good for expressing a single quantity and
     30  * a unit.
     31  * <p>
     32  * First use the add() methods to add a pattern for each plural variant.
     33  * There must be a pattern for the "other" variant.
     34  * Then use the format() method.
     35  * <p>
     36  * Concurrent calls only to const methods on a QuantityFormatter object are
     37  * safe, but concurrent const and non-const method calls on a QuantityFormatter
     38  * object are not safe and require synchronization.
     39  *
     40  */
     41 class U_I18N_API QuantityFormatter : public UMemory {
     42 public:
     43     /**
     44      * Default constructor.
     45      */
     46     QuantityFormatter();
     47 
     48     /**
     49      * Copy constructor.
     50      */
     51     QuantityFormatter(const QuantityFormatter& other);
     52 
     53     /**
     54      * Assignment operator
     55      */
     56     QuantityFormatter &operator=(const QuantityFormatter& other);
     57 
     58     /**
     59      * Destructor.
     60      */
     61     ~QuantityFormatter();
     62 
     63     /**
     64      * Removes all variants from this object including the "other" variant.
     65      */
     66     void reset();
     67 
     68     /**
     69      * Adds a plural variant if there is none yet for the plural form.
     70      *
     71      * @param variant "zero", "one", "two", "few", "many", "other"
     72      * @param rawPattern the pattern for the variant e.g "{0} meters"
     73      * @param status any error returned here.
     74      * @return TRUE on success; FALSE if status was set to a non zero error.
     75      */
     76     UBool addIfAbsent(const char *variant, const UnicodeString &rawPattern, UErrorCode &status);
     77 
     78     /**
     79      * returns TRUE if this object has at least the "other" variant.
     80      */
     81     UBool isValid() const;
     82 
     83     /**
     84      * Gets the pattern formatter that would be used for a particular variant.
     85      * If isValid() returns TRUE, this method is guaranteed to return a
     86      * non-NULL value.
     87      */
     88     const SimplePatternFormatter *getByVariant(const char *variant) const;
     89 
     90     /**
     91      * Formats a number with this object appending the result to appendTo.
     92      * At least the "other" variant must be added to this object for this
     93      * method to work.
     94      *
     95      * @param number the single number.
     96      * @param fmt formats the number
     97      * @param rules computes the plural variant to use.
     98      * @param appendTo result appended here.
     99      * @param status any error returned here.
    100      * @return appendTo
    101      */
    102     UnicodeString &format(
    103             const Formattable &number,
    104             const NumberFormat &fmt,
    105             const PluralRules &rules,
    106             UnicodeString &appendTo,
    107             FieldPosition &pos,
    108             UErrorCode &status) const;
    109 
    110     /**
    111      * Selects the standard plural form for the number/formatter/rules.
    112      */
    113     static StandardPlural::Form selectPlural(
    114             const Formattable &number,
    115             const NumberFormat &fmt,
    116             const PluralRules &rules,
    117             UnicodeString &formattedNumber,
    118             FieldPosition &pos,
    119             UErrorCode &status);
    120 
    121     /**
    122      * Formats the pattern with the value and adjusts the FieldPosition.
    123      */
    124     static UnicodeString &format(
    125             const SimplePatternFormatter &pattern,
    126             const UnicodeString &value,
    127             UnicodeString &appendTo,
    128             FieldPosition &pos,
    129             UErrorCode &status);
    130 
    131 private:
    132     SimplePatternFormatter *formatters[StandardPlural::COUNT];
    133 };
    134 
    135 U_NAMESPACE_END
    136 
    137 #endif
    138 
    139 #endif
    140