1*0e209d39SAndroid Build Coastguard Worker // © 2016 and later: Unicode, Inc. and others. 2*0e209d39SAndroid Build Coastguard Worker // License & terms of use: http://www.unicode.org/copyright.html 3*0e209d39SAndroid Build Coastguard Worker /* 4*0e209d39SAndroid Build Coastguard Worker ****************************************************************************** 5*0e209d39SAndroid Build Coastguard Worker * Copyright (C) 2014-2016, International Business Machines 6*0e209d39SAndroid Build Coastguard Worker * Corporation and others. All Rights Reserved. 7*0e209d39SAndroid Build Coastguard Worker ****************************************************************************** 8*0e209d39SAndroid Build Coastguard Worker * quantityformatter.h 9*0e209d39SAndroid Build Coastguard Worker */ 10*0e209d39SAndroid Build Coastguard Worker 11*0e209d39SAndroid Build Coastguard Worker #ifndef __QUANTITY_FORMATTER_H__ 12*0e209d39SAndroid Build Coastguard Worker #define __QUANTITY_FORMATTER_H__ 13*0e209d39SAndroid Build Coastguard Worker 14*0e209d39SAndroid Build Coastguard Worker #include "unicode/utypes.h" 15*0e209d39SAndroid Build Coastguard Worker #include "unicode/uobject.h" 16*0e209d39SAndroid Build Coastguard Worker 17*0e209d39SAndroid Build Coastguard Worker #if !UCONFIG_NO_FORMATTING 18*0e209d39SAndroid Build Coastguard Worker 19*0e209d39SAndroid Build Coastguard Worker #include "standardplural.h" 20*0e209d39SAndroid Build Coastguard Worker 21*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_BEGIN 22*0e209d39SAndroid Build Coastguard Worker 23*0e209d39SAndroid Build Coastguard Worker class SimpleFormatter; 24*0e209d39SAndroid Build Coastguard Worker class UnicodeString; 25*0e209d39SAndroid Build Coastguard Worker class PluralRules; 26*0e209d39SAndroid Build Coastguard Worker class NumberFormat; 27*0e209d39SAndroid Build Coastguard Worker class Formattable; 28*0e209d39SAndroid Build Coastguard Worker class FieldPosition; 29*0e209d39SAndroid Build Coastguard Worker class FormattedStringBuilder; 30*0e209d39SAndroid Build Coastguard Worker 31*0e209d39SAndroid Build Coastguard Worker /** 32*0e209d39SAndroid Build Coastguard Worker * A plural aware formatter that is good for expressing a single quantity and 33*0e209d39SAndroid Build Coastguard Worker * a unit. 34*0e209d39SAndroid Build Coastguard Worker * <p> 35*0e209d39SAndroid Build Coastguard Worker * First use the add() methods to add a pattern for each plural variant. 36*0e209d39SAndroid Build Coastguard Worker * There must be a pattern for the "other" variant. 37*0e209d39SAndroid Build Coastguard Worker * Then use the format() method. 38*0e209d39SAndroid Build Coastguard Worker * <p> 39*0e209d39SAndroid Build Coastguard Worker * Concurrent calls only to const methods on a QuantityFormatter object are 40*0e209d39SAndroid Build Coastguard Worker * safe, but concurrent const and non-const method calls on a QuantityFormatter 41*0e209d39SAndroid Build Coastguard Worker * object are not safe and require synchronization. 42*0e209d39SAndroid Build Coastguard Worker * 43*0e209d39SAndroid Build Coastguard Worker */ 44*0e209d39SAndroid Build Coastguard Worker class U_I18N_API QuantityFormatter : public UMemory { 45*0e209d39SAndroid Build Coastguard Worker public: 46*0e209d39SAndroid Build Coastguard Worker /** 47*0e209d39SAndroid Build Coastguard Worker * Default constructor. 48*0e209d39SAndroid Build Coastguard Worker */ 49*0e209d39SAndroid Build Coastguard Worker QuantityFormatter(); 50*0e209d39SAndroid Build Coastguard Worker 51*0e209d39SAndroid Build Coastguard Worker /** 52*0e209d39SAndroid Build Coastguard Worker * Copy constructor. 53*0e209d39SAndroid Build Coastguard Worker */ 54*0e209d39SAndroid Build Coastguard Worker QuantityFormatter(const QuantityFormatter& other); 55*0e209d39SAndroid Build Coastguard Worker 56*0e209d39SAndroid Build Coastguard Worker /** 57*0e209d39SAndroid Build Coastguard Worker * Assignment operator 58*0e209d39SAndroid Build Coastguard Worker */ 59*0e209d39SAndroid Build Coastguard Worker QuantityFormatter &operator=(const QuantityFormatter& other); 60*0e209d39SAndroid Build Coastguard Worker 61*0e209d39SAndroid Build Coastguard Worker /** 62*0e209d39SAndroid Build Coastguard Worker * Destructor. 63*0e209d39SAndroid Build Coastguard Worker */ 64*0e209d39SAndroid Build Coastguard Worker ~QuantityFormatter(); 65*0e209d39SAndroid Build Coastguard Worker 66*0e209d39SAndroid Build Coastguard Worker /** 67*0e209d39SAndroid Build Coastguard Worker * Removes all variants from this object including the "other" variant. 68*0e209d39SAndroid Build Coastguard Worker */ 69*0e209d39SAndroid Build Coastguard Worker void reset(); 70*0e209d39SAndroid Build Coastguard Worker 71*0e209d39SAndroid Build Coastguard Worker /** 72*0e209d39SAndroid Build Coastguard Worker * Adds a plural variant if there is none yet for the plural form. 73*0e209d39SAndroid Build Coastguard Worker * 74*0e209d39SAndroid Build Coastguard Worker * @param variant "zero", "one", "two", "few", "many", "other" 75*0e209d39SAndroid Build Coastguard Worker * @param rawPattern the pattern for the variant e.g "{0} meters" 76*0e209d39SAndroid Build Coastguard Worker * @param status any error returned here. 77*0e209d39SAndroid Build Coastguard Worker * @return true on success; false if status was set to a non zero error. 78*0e209d39SAndroid Build Coastguard Worker */ 79*0e209d39SAndroid Build Coastguard Worker UBool addIfAbsent(const char *variant, const UnicodeString &rawPattern, UErrorCode &status); 80*0e209d39SAndroid Build Coastguard Worker 81*0e209d39SAndroid Build Coastguard Worker /** 82*0e209d39SAndroid Build Coastguard Worker * returns true if this object has at least the "other" variant. 83*0e209d39SAndroid Build Coastguard Worker */ 84*0e209d39SAndroid Build Coastguard Worker UBool isValid() const; 85*0e209d39SAndroid Build Coastguard Worker 86*0e209d39SAndroid Build Coastguard Worker /** 87*0e209d39SAndroid Build Coastguard Worker * Gets the pattern formatter that would be used for a particular variant. 88*0e209d39SAndroid Build Coastguard Worker * If isValid() returns true, this method is guaranteed to return a 89*0e209d39SAndroid Build Coastguard Worker * non-nullptr value. 90*0e209d39SAndroid Build Coastguard Worker */ 91*0e209d39SAndroid Build Coastguard Worker const SimpleFormatter *getByVariant(const char *variant) const; 92*0e209d39SAndroid Build Coastguard Worker 93*0e209d39SAndroid Build Coastguard Worker /** 94*0e209d39SAndroid Build Coastguard Worker * Formats a number with this object appending the result to appendTo. 95*0e209d39SAndroid Build Coastguard Worker * At least the "other" variant must be added to this object for this 96*0e209d39SAndroid Build Coastguard Worker * method to work. 97*0e209d39SAndroid Build Coastguard Worker * 98*0e209d39SAndroid Build Coastguard Worker * @param number the single number. 99*0e209d39SAndroid Build Coastguard Worker * @param fmt formats the number 100*0e209d39SAndroid Build Coastguard Worker * @param rules computes the plural variant to use. 101*0e209d39SAndroid Build Coastguard Worker * @param appendTo result appended here. 102*0e209d39SAndroid Build Coastguard Worker * @param status any error returned here. 103*0e209d39SAndroid Build Coastguard Worker * @return appendTo 104*0e209d39SAndroid Build Coastguard Worker */ 105*0e209d39SAndroid Build Coastguard Worker UnicodeString &format( 106*0e209d39SAndroid Build Coastguard Worker const Formattable &number, 107*0e209d39SAndroid Build Coastguard Worker const NumberFormat &fmt, 108*0e209d39SAndroid Build Coastguard Worker const PluralRules &rules, 109*0e209d39SAndroid Build Coastguard Worker UnicodeString &appendTo, 110*0e209d39SAndroid Build Coastguard Worker FieldPosition &pos, 111*0e209d39SAndroid Build Coastguard Worker UErrorCode &status) const; 112*0e209d39SAndroid Build Coastguard Worker 113*0e209d39SAndroid Build Coastguard Worker /** 114*0e209d39SAndroid Build Coastguard Worker * Selects the standard plural form for the number/formatter/rules. 115*0e209d39SAndroid Build Coastguard Worker * Used in MeasureFormat for backwards compatibility with NumberFormat. 116*0e209d39SAndroid Build Coastguard Worker */ 117*0e209d39SAndroid Build Coastguard Worker static StandardPlural::Form selectPlural( 118*0e209d39SAndroid Build Coastguard Worker const Formattable &number, 119*0e209d39SAndroid Build Coastguard Worker const NumberFormat &fmt, 120*0e209d39SAndroid Build Coastguard Worker const PluralRules &rules, 121*0e209d39SAndroid Build Coastguard Worker UnicodeString &formattedNumber, 122*0e209d39SAndroid Build Coastguard Worker FieldPosition &pos, 123*0e209d39SAndroid Build Coastguard Worker UErrorCode &status); 124*0e209d39SAndroid Build Coastguard Worker 125*0e209d39SAndroid Build Coastguard Worker /** 126*0e209d39SAndroid Build Coastguard Worker * Formats a quantity and selects its plural form. The output is appended 127*0e209d39SAndroid Build Coastguard Worker * to a FormattedStringBuilder in order to retain field information. 128*0e209d39SAndroid Build Coastguard Worker * 129*0e209d39SAndroid Build Coastguard Worker * @param quantity The number to format. 130*0e209d39SAndroid Build Coastguard Worker * @param fmt The formatter to use to format the number. 131*0e209d39SAndroid Build Coastguard Worker * @param rules The rules to use to select the plural form of the 132*0e209d39SAndroid Build Coastguard Worker * formatted number. 133*0e209d39SAndroid Build Coastguard Worker * @param output Where to append the result of the format operation. 134*0e209d39SAndroid Build Coastguard Worker * @param pluralForm Output variable populated with the plural form of the 135*0e209d39SAndroid Build Coastguard Worker * formatted number. 136*0e209d39SAndroid Build Coastguard Worker * @param status Set if an error occurs. 137*0e209d39SAndroid Build Coastguard Worker */ 138*0e209d39SAndroid Build Coastguard Worker static void formatAndSelect( 139*0e209d39SAndroid Build Coastguard Worker double quantity, 140*0e209d39SAndroid Build Coastguard Worker const NumberFormat& fmt, 141*0e209d39SAndroid Build Coastguard Worker const PluralRules& rules, 142*0e209d39SAndroid Build Coastguard Worker FormattedStringBuilder& output, 143*0e209d39SAndroid Build Coastguard Worker StandardPlural::Form& pluralForm, 144*0e209d39SAndroid Build Coastguard Worker UErrorCode& status); 145*0e209d39SAndroid Build Coastguard Worker 146*0e209d39SAndroid Build Coastguard Worker /** 147*0e209d39SAndroid Build Coastguard Worker * Formats the pattern with the value and adjusts the FieldPosition. 148*0e209d39SAndroid Build Coastguard Worker * TODO: Remove? 149*0e209d39SAndroid Build Coastguard Worker */ 150*0e209d39SAndroid Build Coastguard Worker static UnicodeString &format( 151*0e209d39SAndroid Build Coastguard Worker const SimpleFormatter &pattern, 152*0e209d39SAndroid Build Coastguard Worker const UnicodeString &value, 153*0e209d39SAndroid Build Coastguard Worker UnicodeString &appendTo, 154*0e209d39SAndroid Build Coastguard Worker FieldPosition &pos, 155*0e209d39SAndroid Build Coastguard Worker UErrorCode &status); 156*0e209d39SAndroid Build Coastguard Worker 157*0e209d39SAndroid Build Coastguard Worker private: 158*0e209d39SAndroid Build Coastguard Worker SimpleFormatter *formatters[StandardPlural::COUNT]; 159*0e209d39SAndroid Build Coastguard Worker }; 160*0e209d39SAndroid Build Coastguard Worker 161*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_END 162*0e209d39SAndroid Build Coastguard Worker 163*0e209d39SAndroid Build Coastguard Worker #endif 164*0e209d39SAndroid Build Coastguard Worker 165*0e209d39SAndroid Build Coastguard Worker #endif 166