]> git.saurik.com Git - apple/icu.git/blob - icuSources/i18n/quantityformatter.h
ICU-57166.0.1.tar.gz
[apple/icu.git] / icuSources / i18n / quantityformatter.h
1 /*
2 ******************************************************************************
3 * Copyright (C) 2014-2016, 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 SimpleFormatter;
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 SimpleFormatter *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 SimpleFormatter &pattern,
126 const UnicodeString &value,
127 UnicodeString &appendTo,
128 FieldPosition &pos,
129 UErrorCode &status);
130
131 private:
132 SimpleFormatter *formatters[StandardPlural::COUNT];
133 };
134
135 U_NAMESPACE_END
136
137 #endif
138
139 #endif