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