• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 ******************************************************************************
3 * Copyright (C) 2014, 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 U_NAMESPACE_BEGIN
16 
17 class SimplePatternFormatter;
18 class UnicodeString;
19 class PluralRules;
20 class NumberFormat;
21 class Formattable;
22 class FieldPosition;
23 
24 /**
25  * A plural aware formatter that is good for expressing a single quantity and
26  * a unit.
27  * <p>
28  * First use the add() methods to add a pattern for each plural variant.
29  * There must be a pattern for the "other" variant.
30  * Then use the format() method.
31  * <p>
32  * Concurrent calls only to const methods on a QuantityFormatter object are
33  * safe, but concurrent const and non-const method calls on a QuantityFormatter
34  * object are not safe and require synchronization.
35  *
36  */
37 class U_I18N_API QuantityFormatter : public UMemory {
38 // TODO(Travis Keep): Add test for copy constructor, assignment, and reset.
39 public:
40     /**
41      * Default constructor.
42      */
43     QuantityFormatter();
44 
45     /**
46      * Copy constructor.
47      */
48     QuantityFormatter(const QuantityFormatter& other);
49 
50     /**
51      * Assignment operator
52      */
53     QuantityFormatter &operator=(const QuantityFormatter& other);
54 
55     /**
56      * Destructor.
57      */
58     ~QuantityFormatter();
59 
60     /**
61      * Removes all variants from this object including the "other" variant.
62      */
63     void reset();
64 
65     /**
66       * Adds a plural variant.
67       *
68       * @param variant "zero", "one", "two", "few", "many", "other"
69       * @param rawPattern the pattern for the variant e.g "{0} meters"
70       * @param status any error returned here.
71       * @return TRUE on success; FALSE otherwise.
72       */
73     UBool add(
74             const char *variant,
75             const UnicodeString &rawPattern,
76             UErrorCode &status);
77 
78     /**
79      * returns TRUE if this object has at least the "other" variant.
80      */
81     UBool isValid() const;
82 
83     /**
84      * Formats a quantity with this object appending the result to appendTo.
85      * At least the "other" variant must be added to this object for this
86      * method to work.
87      *
88      * @param quantity the single quantity.
89      * @param fmt formats the quantity
90      * @param rules computes the plural variant to use.
91      * @param appendTo result appended here.
92      * @param status any error returned here.
93      * @return appendTo
94      */
95     UnicodeString &format(
96             const Formattable &quantity,
97             const NumberFormat &fmt,
98             const PluralRules &rules,
99             UnicodeString &appendTo,
100             FieldPosition &pos,
101             UErrorCode &status) const;
102 
103 private:
104     SimplePatternFormatter *formatters[6];
105 };
106 
107 U_NAMESPACE_END
108 
109 #endif
110