• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 **********************************************************************
3 * Copyright (c) 2004-2014, International Business Machines
4 * Corporation and others.  All Rights Reserved.
5 **********************************************************************
6 * Author: Alan Liu
7 * Created: April 20, 2004
8 * Since: ICU 3.0
9 **********************************************************************
10 */
11 #ifndef MEASUREFORMAT_H
12 #define MEASUREFORMAT_H
13 
14 #include "unicode/utypes.h"
15 #include "unicode/measure.h"
16 
17 #if !UCONFIG_NO_FORMATTING
18 
19 #include "unicode/format.h"
20 #include "unicode/udat.h"
21 
22 /**
23  * \file
24  * \brief C++ API: Formatter for measure objects.
25  */
26 
27 #ifndef U_HIDE_DRAFT_API
28 /**
29  * Constants for various widths.
30  * There are 3 widths: Wide, Short, Narrow.
31  * For example, for English, when formatting "3 hours"
32  * Wide is "3 hours"; short is "3 hrs"; narrow is "3h"
33  * @draft ICU 53
34  */
35 enum UMeasureFormatWidth {
36 
37     // Wide, short, and narrow must be first and in this order.
38     /**
39      * Spell out measure units.
40      * @draft ICU 53
41      */
42     UMEASFMT_WIDTH_WIDE,
43 
44     /**
45      * Abbreviate measure units.
46      * @draft ICU 53
47      */
48     UMEASFMT_WIDTH_SHORT,
49 
50     /**
51      * Use symbols for measure units when possible.
52      * @draft ICU 53
53      */
54     UMEASFMT_WIDTH_NARROW,
55 
56     /**
57      * Completely omit measure units when possible. For example, format
58      * '5 hours, 37 minutes' as '5:37'
59      * @draft ICU 53
60      */
61     UMEASFMT_WIDTH_NUMERIC,
62 
63     /**
64      * Count of values in this enum.
65      * @draft ICU 53
66      */
67     UMEASFMT_WIDTH_COUNT
68 };
69 /** @draft ICU 53 */
70 typedef enum UMeasureFormatWidth UMeasureFormatWidth;
71 #endif /* U_HIDE_DRAFT_API */
72 
73 U_NAMESPACE_BEGIN
74 
75 class NumberFormat;
76 class PluralRules;
77 class MeasureFormatCacheData;
78 class SharedNumberFormat;
79 class SharedPluralRules;
80 class QuantityFormatter;
81 class ListFormatter;
82 class DateFormat;
83 
84 /**
85  *
86  * A formatter for measure objects.
87  *
88  * @see Format
89  * @author Alan Liu
90  * @stable ICU 3.0
91  */
92 class U_I18N_API MeasureFormat : public Format {
93  public:
94     using Format::parseObject;
95     using Format::format;
96 
97 #ifndef U_HIDE_DRAFT_API
98     /**
99      * Constructor.
100      * @draft ICU 53
101      */
102     MeasureFormat(
103             const Locale &locale, UMeasureFormatWidth width, UErrorCode &status);
104 
105     /**
106      * Constructor.
107      * @draft ICU 53
108      */
109     MeasureFormat(
110             const Locale &locale,
111             UMeasureFormatWidth width,
112             NumberFormat *nfToAdopt,
113             UErrorCode &status);
114 #endif /* U_HIDE_DRAFT_API */
115 
116     /**
117      * Copy constructor.
118      * @draft ICU 53
119      */
120     MeasureFormat(const MeasureFormat &other);
121 
122     /**
123      * Assignment operator.
124      * @draft ICU 53
125      */
126     MeasureFormat &operator=(const MeasureFormat &rhs);
127 
128     /**
129      * Destructor.
130      * @stable ICU 3.0
131      */
132     virtual ~MeasureFormat();
133 
134     /**
135      * Return true if given Format objects are semantically equal.
136      * @draft ICU 53
137      */
138     virtual UBool operator==(const Format &other) const;
139 
140     /**
141      * Clones this object polymorphically.
142      * @draft ICU 53
143      */
144     virtual Format *clone() const;
145 
146     /**
147      * Formats object to produce a string.
148      * @draft ICU 53
149      */
150     virtual UnicodeString &format(
151             const Formattable &obj,
152             UnicodeString &appendTo,
153             FieldPosition &pos,
154             UErrorCode &status) const;
155 
156     /**
157      * Parse a string to produce an object. This implementation sets
158      * status to U_UNSUPPORTED_ERROR.
159      *
160      * @draft ICU 53
161      */
162     virtual void parseObject(
163             const UnicodeString &source,
164             Formattable &reslt,
165             ParsePosition &pos) const;
166 
167 #ifndef U_HIDE_DRAFT_API
168     /**
169      * Formats measure objects to produce a string. An example of such a
170      * formatted string is 3 meters, 3.5 centimeters. Measure objects appear
171      * in the formatted string in the same order they appear in the "measures"
172      * array. The NumberFormat of this object is used only to format the amount
173      * of the very last measure. The other amounts are formatted with zero
174      * decimal places while rounding toward zero.
175      * @param measures array of measure objects.
176      * @param measureCount the number of measure objects.
177      * @param appendTo formatted string appended here.
178      * @param pos the field position.
179      * @param status the error.
180      * @return appendTo reference
181      *
182      * @draft ICU 53
183      */
184     UnicodeString &formatMeasures(
185             const Measure *measures,
186             int32_t measureCount,
187             UnicodeString &appendTo,
188             FieldPosition &pos,
189             UErrorCode &status) const;
190 #endif  /* U_HIDE_DRAFT_API */
191 
192 
193     /**
194      * Return a formatter for CurrencyAmount objects in the given
195      * locale.
196      * @param locale desired locale
197      * @param ec input-output error code
198      * @return a formatter object, or NULL upon error
199      * @stable ICU 3.0
200      */
201     static MeasureFormat* U_EXPORT2 createCurrencyFormat(const Locale& locale,
202                                                UErrorCode& ec);
203 
204     /**
205      * Return a formatter for CurrencyAmount objects in the default
206      * locale.
207      * @param ec input-output error code
208      * @return a formatter object, or NULL upon error
209      * @stable ICU 3.0
210      */
211     static MeasureFormat* U_EXPORT2 createCurrencyFormat(UErrorCode& ec);
212 
213     /**
214      * Return the class ID for this class. This is useful only for comparing to
215      * a return value from getDynamicClassID(). For example:
216      * <pre>
217      * .   Base* polymorphic_pointer = createPolymorphicObject();
218      * .   if (polymorphic_pointer->getDynamicClassID() ==
219      * .       erived::getStaticClassID()) ...
220      * </pre>
221      * @return          The class ID for all objects of this class.
222      * @draft ICU 53
223      */
224     static UClassID U_EXPORT2 getStaticClassID(void);
225 
226     /**
227      * Returns a unique class ID POLYMORPHICALLY. Pure virtual override. This
228      * method is to implement a simple version of RTTI, since not all C++
229      * compilers support genuine RTTI. Polymorphic operator==() and clone()
230      * methods call this method.
231      *
232      * @return          The class ID for this object. All objects of a
233      *                  given class have the same class ID.  Objects of
234      *                  other classes have different class IDs.
235      * @draft ICU 53
236      */
237     virtual UClassID getDynamicClassID(void) const;
238 
239  protected:
240     /**
241      * Default constructor.
242      * @stable ICU 3.0
243      */
244     MeasureFormat();
245 
246 #ifndef U_HIDE_INTERNAL_API
247 
248 #ifndef U_HIDE_DRAFT_API
249     /**
250      * ICU use only.
251      * Initialize or change MeasureFormat class from subclass.
252      * @internal.
253      */
254     void initMeasureFormat(
255             const Locale &locale,
256             UMeasureFormatWidth width,
257             NumberFormat *nfToAdopt,
258             UErrorCode &status);
259 #endif
260     /**
261      * ICU use only.
262      * Allows subclass to change locale. Note that this method also changes
263      * the NumberFormat object. Returns TRUE if locale changed; FALSE if no
264      * change was made.
265      * @internal.
266      */
267     UBool setMeasureFormatLocale(const Locale &locale, UErrorCode &status);
268 
269     /**
270      * ICU use only.
271      * Let subclass change NumberFormat.
272      * @internal.
273      */
274     void adoptNumberFormat(NumberFormat *nfToAdopt, UErrorCode &status);
275 
276     /**
277      * ICU use only.
278      * @internal.
279      */
280     const NumberFormat &getNumberFormat() const;
281 
282     /**
283      * ICU use only.
284      * @internal.
285      */
286     const PluralRules &getPluralRules() const;
287 
288     /**
289      * ICU use only.
290      * @internal.
291      */
292     Locale getLocale(UErrorCode &status) const;
293 
294     /**
295      * ICU use only.
296      * @internal.
297      */
298     const char *getLocaleID(UErrorCode &status) const;
299 
300 #endif /* U_HIDE_INTERNAL_API */
301 
302  private:
303     const MeasureFormatCacheData *cache;
304     const SharedNumberFormat *numberFormat;
305     const SharedPluralRules *pluralRules;
306 #ifndef U_HIDE_DRAFT_API
307     UMeasureFormatWidth width;
308 #endif
309 
310     // Declared outside of MeasureFormatSharedData because ListFormatter
311     // objects are relatively cheap to copy; therefore, they don't need to be
312     // shared across instances.
313     ListFormatter *listFormatter;
314 
315     const QuantityFormatter *getQuantityFormatter(
316             int32_t index,
317             int32_t widthIndex,
318             UErrorCode &status) const;
319 
320     UnicodeString &formatMeasure(
321         const Measure &measure,
322         const NumberFormat &nf,
323         UnicodeString &appendTo,
324         FieldPosition &pos,
325         UErrorCode &status) const;
326 
327     UnicodeString &formatMeasuresSlowTrack(
328         const Measure *measures,
329         int32_t measureCount,
330         UnicodeString& appendTo,
331         FieldPosition& pos,
332         UErrorCode& status) const;
333 
334     UnicodeString &formatNumeric(
335         const Formattable *hms,  // always length 3: [0] is hour; [1] is
336                                  // minute; [2] is second.
337         int32_t bitMap,   // 1=hour set, 2=minute set, 4=second set
338         UnicodeString &appendTo,
339         UErrorCode &status) const;
340 
341     UnicodeString &formatNumeric(
342         UDate date,
343         const DateFormat &dateFmt,
344         UDateFormatField smallestField,
345         const Formattable &smallestAmount,
346         UnicodeString &appendTo,
347         UErrorCode &status) const;
348 };
349 
350 U_NAMESPACE_END
351 
352 #endif // #if !UCONFIG_NO_FORMATTING
353 #endif // #ifndef MEASUREFORMAT_H
354