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