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