1 /*
2 ********************************************************************************
3 *   Copyright (C) 2012-2014, International Business Machines
4 *   Corporation and others.  All Rights Reserved.
5 ********************************************************************************
6 *
7 * File COMPACTDECIMALFORMAT.H
8 ********************************************************************************
9 */
10 
11 #ifndef __COMPACT_DECIMAL_FORMAT_H__
12 #define __COMPACT_DECIMAL_FORMAT_H__
13 
14 #include "unicode/utypes.h"
15 /**
16  * \file
17  * \brief C++ API: Formats decimal numbers in compact form.
18  */
19 
20 #if !UCONFIG_NO_FORMATTING
21 
22 #include "unicode/decimfmt.h"
23 
24 struct UHashtable;
25 
26 U_NAMESPACE_BEGIN
27 
28 class PluralRules;
29 
30 /**
31  * The CompactDecimalFormat produces abbreviated numbers, suitable for display in
32  * environments will limited real estate. For example, 'Hits: 1.2B' instead of
33  * 'Hits: 1,200,000,000'. The format will be appropriate for the given language,
34  * such as "1,2 Mrd." for German.
35  * <p>
36  * For numbers under 1000 trillion (under 10^15, such as 123,456,789,012,345),
37  * the result will be short for supported languages. However, the result may
38  * sometimes exceed 7 characters, such as when there are combining marks or thin
39  * characters. In such cases, the visual width in fonts should still be short.
40  * <p>
41  * By default, there are 3 significant digits. After creation, if more than
42  * three significant digits are set (with setMaximumSignificantDigits), or if a
43  * fixed number of digits are set (with setMaximumIntegerDigits or
44  * setMaximumFractionDigits), then result may be wider.
45  * <p>
46  * At this time, parsing is not supported, and will produce a U_UNSUPPORTED_ERROR.
47  * Resetting the pattern prefixes or suffixes is not supported; the method calls
48  * are ignored.
49  * <p>
50  * @stable ICU 51
51  */
52 class U_I18N_API CompactDecimalFormat : public DecimalFormat {
53 public:
54 
55      /**
56       * Returns a compact decimal instance for specified locale.
57       * @param inLocale the given locale.
58       * @param style whether to use short or long style.
59       * @param status error code returned  here.
60       * @stable ICU 51
61       */
62      static CompactDecimalFormat* U_EXPORT2 createInstance(
63           const Locale& inLocale, UNumberCompactStyle style, UErrorCode& status);
64 
65     /**
66      * Copy constructor.
67      *
68      * @param source    the DecimalFormat object to be copied from.
69      * @stable ICU 51
70       */
71     CompactDecimalFormat(const CompactDecimalFormat& source);
72 
73     /**
74      * Destructor.
75      * @stable ICU 51
76      */
77     virtual ~CompactDecimalFormat();
78 
79     /**
80      * Assignment operator.
81      *
82      * @param rhs    the DecimalFormat object to be copied.
83      * @stable ICU 51
84      */
85     CompactDecimalFormat& operator=(const CompactDecimalFormat& rhs);
86 
87     /**
88      * Clone this Format object polymorphically. The caller owns the
89      * result and should delete it when done.
90      *
91      * @return    a polymorphic copy of this CompactDecimalFormat.
92      * @stable ICU 51
93      */
94     virtual Format* clone() const;
95 
96     /**
97      * Return TRUE if the given Format objects are semantically equal.
98      * Objects of different subclasses are considered unequal.
99      *
100      * @param other    the object to be compared with.
101      * @return         TRUE if the given Format objects are semantically equal.
102      * @stable ICU 51
103      */
104     virtual UBool operator==(const Format& other) const;
105 
106 
107     using DecimalFormat::format;
108 
109     /**
110      * Format a double or long number using base-10 representation.
111      *
112      * @param number    The value to be formatted.
113      * @param appendTo  Output parameter to receive result.
114      *                  Result is appended to existing contents.
115      * @param pos       On input: an alignment field, if desired.
116      *                  On output: the offsets of the alignment field.
117      * @return          Reference to 'appendTo' parameter.
118      * @stable ICU 51
119      */
120     virtual UnicodeString& format(double number,
121                                   UnicodeString& appendTo,
122                                   FieldPosition& pos) const;
123 
124     /**
125      * Format a double or long number using base-10 representation.
126      * Currently sets status to U_UNSUPPORTED_ERROR.
127      *
128      * @param number    The value to be formatted.
129      * @param appendTo  Output parameter to receive result.
130      *                  Result is appended to existing contents.
131      * @param posIter   On return, can be used to iterate over positions
132      *                  of fields generated by this format call.
133      *                  Can be NULL.
134      * @param status    Output param filled with success/failure status.
135      * @return          Reference to 'appendTo' parameter.
136      * @internal
137      */
138     virtual UnicodeString& format(double number,
139                                   UnicodeString& appendTo,
140                                   FieldPositionIterator* posIter,
141                                   UErrorCode& status) const;
142 
143     /**
144      * Format an int64 number using base-10 representation.
145      *
146      * @param number    The value to be formatted.
147      * @param appendTo  Output parameter to receive result.
148      *                  Result is appended to existing contents.
149      * @param pos       On input: an alignment field, if desired.
150      *                  On output: the offsets of the alignment field.
151      * @return          Reference to 'appendTo' parameter.
152      * @stable ICU 51
153      */
154     virtual UnicodeString& format(int64_t number,
155                                   UnicodeString& appendTo,
156                                   FieldPosition& pos) const;
157 
158     /**
159      * Format an int64 number using base-10 representation.
160      * Currently sets status to U_UNSUPPORTED_ERROR
161      *
162      * @param number    The value to be formatted.
163      * @param appendTo  Output parameter to receive result.
164      *                  Result is appended to existing contents.
165      * @param posIter   On return, can be used to iterate over positions
166      *                  of fields generated by this format call.
167      *                  Can be NULL.
168      * @param status    Output param filled with success/failure status.
169      * @return          Reference to 'appendTo' parameter.
170      * @internal
171      */
172     virtual UnicodeString& format(int64_t number,
173                                   UnicodeString& appendTo,
174                                   FieldPositionIterator* posIter,
175                                   UErrorCode& status) const;
176 
177     /**
178      * Format a decimal number. Currently sets status to U_UNSUPPORTED_ERROR
179      * The syntax of the unformatted number is a "numeric string"
180      * as defined in the Decimal Arithmetic Specification, available at
181      * http://speleotrove.com/decimal
182      *
183      * @param number    The unformatted number, as a string.
184      * @param appendTo  Output parameter to receive result.
185      *                  Result is appended to existing contents.
186      * @param posIter   On return, can be used to iterate over positions
187      *                  of fields generated by this format call.
188      *                  Can be NULL.
189      * @param status    Output param filled with success/failure status.
190      * @return          Reference to 'appendTo' parameter.
191      * @internal
192      */
193     virtual UnicodeString& format(const StringPiece &number,
194                                   UnicodeString& appendTo,
195                                   FieldPositionIterator* posIter,
196                                   UErrorCode& status) const;
197 
198     /**
199      * Format a decimal number. Currently sets status to U_UNSUPPORTED_ERROR
200      * The number is a DigitList wrapper onto a floating point decimal number.
201      * The default implementation in NumberFormat converts the decimal number
202      * to a double and formats that.
203      *
204      * @param number    The number, a DigitList format Decimal Floating Point.
205      * @param appendTo  Output parameter to receive result.
206      *                  Result is appended to existing contents.
207      * @param posIter   On return, can be used to iterate over positions
208      *                  of fields generated by this format call.
209      * @param status    Output param filled with success/failure status.
210      * @return          Reference to 'appendTo' parameter.
211      * @internal
212      */
213     virtual UnicodeString& format(const DigitList &number,
214                                   UnicodeString& appendTo,
215                                   FieldPositionIterator* posIter,
216                                   UErrorCode& status) const;
217 
218     /**
219      * Format a decimal number. Currently sets status to U_UNSUPPORTED_ERROR.
220      * The number is a DigitList wrapper onto a floating point decimal number.
221      * The default implementation in NumberFormat converts the decimal number
222      * to a double and formats that.
223      *
224      * @param number    The number, a DigitList format Decimal Floating Point.
225      * @param appendTo  Output parameter to receive result.
226      *                  Result is appended to existing contents.
227      * @param pos       On input: an alignment field, if desired.
228      *                  On output: the offsets of the alignment field.
229      * @param status    Output param filled with success/failure status.
230      * @return          Reference to 'appendTo' parameter.
231      * @internal
232      */
233     virtual UnicodeString& format(const DigitList &number,
234                                   UnicodeString& appendTo,
235                                   FieldPosition& pos,
236                                   UErrorCode& status) const;
237 
238    /**
239     * CompactDecimalFormat does not support parsing. This implementation
240     * does nothing.
241     * @param text           Unused.
242     * @param result         Does not change.
243     * @param parsePosition  Does not change.
244     * @see Formattable
245     * @stable ICU 51
246     */
247     virtual void parse(const UnicodeString& text,
248                        Formattable& result,
249                        ParsePosition& parsePosition) const;
250 
251     /**
252      * CompactDecimalFormat does not support parsing. This implementation
253      * sets status to U_UNSUPPORTED_ERROR
254      *
255      * @param text      Unused.
256      * @param result    Does not change.
257      * @param status    Always set to U_UNSUPPORTED_ERROR.
258      * @stable ICU 51
259      */
260     virtual void parse(const UnicodeString& text,
261                        Formattable& result,
262                        UErrorCode& status) const;
263 
264     /**
265      * Parses text from the given string as a currency amount.  Unlike
266      * the parse() method, this method will attempt to parse a generic
267      * currency name, searching for a match of this object's locale's
268      * currency display names, or for a 3-letter ISO currency code.
269      * This method will fail if this format is not a currency format,
270      * that is, if it does not contain the currency pattern symbol
271      * (U+00A4) in its prefix or suffix. This implementation always returns
272      * NULL.
273      *
274      * @param text the string to parse
275      * @param pos  input-output position; on input, the position within text
276      *             to match; must have 0 <= pos.getIndex() < text.length();
277      *             on output, the position after the last matched character.
278      *             If the parse fails, the position in unchanged upon output.
279      * @return     if parse succeeds, a pointer to a newly-created CurrencyAmount
280      *             object (owned by the caller) containing information about
281      *             the parsed currency; if parse fails, this is NULL.
282      * @internal
283      */
284     virtual CurrencyAmount* parseCurrency(const UnicodeString& text,
285                                           ParsePosition& pos) const;
286 
287     /**
288      * Return the class ID for this class.  This is useful only for
289      * comparing to a return value from getDynamicClassID().  For example:
290      * <pre>
291      * .      Base* polymorphic_pointer = createPolymorphicObject();
292      * .      if (polymorphic_pointer->getDynamicClassID() ==
293      * .          Derived::getStaticClassID()) ...
294      * </pre>
295      * @return          The class ID for all objects of this class.
296      * @stable ICU 51
297      */
298     static UClassID U_EXPORT2 getStaticClassID();
299 
300     /**
301      * Returns a unique class ID POLYMORPHICALLY.  Pure virtual override.
302      * This method is to implement a simple version of RTTI, since not all
303      * C++ compilers support genuine RTTI.  Polymorphic operator==() and
304      * clone() methods call this method.
305      *
306      * @return          The class ID for this object. All objects of a
307      *                  given class have the same class ID.  Objects of
308      *                  other classes have different class IDs.
309      * @stable ICU 51
310      */
311     virtual UClassID getDynamicClassID() const;
312 
313 private:
314 
315     const UHashtable* _unitsByVariant;
316     const double* _divisors;
317     PluralRules* _pluralRules;
318 
319     // Default constructor not implemented.
320     CompactDecimalFormat(const DecimalFormat &, const UHashtable* unitsByVariant, const double* divisors, PluralRules* pluralRules);
321 
322     UBool eqHelper(const CompactDecimalFormat& that) const;
323 };
324 
325 U_NAMESPACE_END
326 
327 #endif /* #if !UCONFIG_NO_FORMATTING */
328 
329 #endif // __COMPACT_DECIMAL_FORMAT_H__
330 //eof
331