Imported Upstream version 58.1
[platform/upstream/icu.git] / source / i18n / digitaffixesandpadding.h
1 // Copyright (C) 2016 and later: Unicode, Inc. and others.
2 // License & terms of use: http://www.unicode.org/copyright.html
3 /*
4 *******************************************************************************
5 * Copyright (C) 2015, International Business Machines
6 * Corporation and others.  All Rights Reserved.
7 *******************************************************************************
8 * digitaffixesandpadding.h
9 *
10 * created on: 2015jan06
11 * created by: Travis Keep
12 */
13
14 #ifndef __DIGITAFFIXESANDPADDING_H__
15 #define __DIGITAFFIXESANDPADDING_H__
16
17 #include "unicode/utypes.h"
18
19 #if !UCONFIG_NO_FORMATTING
20
21 #include "unicode/uobject.h"
22 #include "pluralaffix.h"
23
24 U_NAMESPACE_BEGIN
25
26 class DigitList;
27 class ValueFormatter;
28 class UnicodeString;
29 class FieldPositionHandler;
30 class PluralRules;
31 class VisibleDigitsWithExponent;
32
33 /**
34  * A formatter of numbers. This class can format any numerical value
35  * except for not a number (NaN), positive infinity, and negative infinity.
36  * This class manages prefixes, suffixes, and padding but delegates the
37  * formatting of actual positive values to a ValueFormatter.
38  */
39 class U_I18N_API DigitAffixesAndPadding : public UMemory {
40 public:
41
42 /**
43  * Equivalent to DecimalFormat EPadPosition, but redeclared here to prevent
44  * depending on DecimalFormat which would cause a circular dependency.
45  */
46 enum EPadPosition {
47     kPadBeforePrefix,
48     kPadAfterPrefix,
49     kPadBeforeSuffix,
50     kPadAfterSuffix
51 };
52
53 /**
54  * The positive prefix
55  */
56 PluralAffix fPositivePrefix;
57
58 /**
59  * The positive suffix
60  */
61 PluralAffix fPositiveSuffix;
62
63 /**
64  * The negative suffix
65  */
66 PluralAffix fNegativePrefix;
67
68 /**
69  * The negative suffix
70  */
71 PluralAffix fNegativeSuffix;
72
73 /**
74  * The padding position
75  */
76 EPadPosition fPadPosition;
77
78 /**
79  * The padding character.
80  */
81 UChar32 fPadChar;
82
83 /**
84  * The field width in code points. The format method inserts instances of
85  * the padding character as needed in the desired padding position so that
86  * the entire formatted string contains this many code points. If the
87  * formatted string already exceeds this many code points, the format method
88  * inserts no padding.
89  */
90 int32_t fWidth;
91
92 /**
93  * Pad position is before prefix; padding character is '*' field width is 0.
94  * The affixes are all the empty string with no annotated fields with just
95  * the 'other' plural variation.
96  */
97 DigitAffixesAndPadding()
98         : fPadPosition(kPadBeforePrefix), fPadChar(0x2a), fWidth(0) { }
99
100 /**
101  * Returns TRUE if this object is equal to rhs.
102  */
103 UBool equals(const DigitAffixesAndPadding &rhs) const {
104     return (fPositivePrefix.equals(rhs.fPositivePrefix) &&
105             fPositiveSuffix.equals(rhs.fPositiveSuffix) &&
106             fNegativePrefix.equals(rhs.fNegativePrefix) &&
107             fNegativeSuffix.equals(rhs.fNegativeSuffix) &&
108             fPadPosition == rhs.fPadPosition &&
109             fWidth == rhs.fWidth &&
110             fPadChar == rhs.fPadChar);
111 }
112
113 /**
114  * Returns TRUE if a plural rules instance is needed to complete the
115  * formatting by detecting if any of the affixes have multiple plural
116  * variations.
117  */
118 UBool needsPluralRules() const;
119
120 /**
121  * Formats value and appends to appendTo.
122  *
123  * @param value the value to format. May be NaN or ininite.
124  * @param formatter handles the details of formatting the actual value.
125  * @param handler records field positions
126  * @param optPluralRules the plural rules, but may be NULL if
127  *   needsPluralRules returns FALSE. 
128  * @appendTo formatted string appended here.
129  * @status any error returned here.
130  */
131 UnicodeString &format(
132         const VisibleDigitsWithExponent &value,
133         const ValueFormatter &formatter,
134         FieldPositionHandler &handler,
135         const PluralRules *optPluralRules,
136         UnicodeString &appendTo,
137         UErrorCode &status) const;
138
139 /**
140  * For testing only.
141  */
142 UnicodeString &format(
143         DigitList &value,
144         const ValueFormatter &formatter,
145         FieldPositionHandler &handler,
146         const PluralRules *optPluralRules,
147         UnicodeString &appendTo,
148         UErrorCode &status) const;
149
150 /**
151  * Formats a 32-bit integer and appends to appendTo. When formatting an
152  * integer, this method is preferred to plain format as it can run
153  * several times faster under certain conditions.
154  *
155  * @param value the value to format.
156  * @param formatter handles the details of formatting the actual value.
157  * @param handler records field positions
158  * @param optPluralRules the plural rules, but may be NULL if
159  *   needsPluralRules returns FALSE. 
160  * @appendTo formatted string appended here.
161  * @status any error returned here.
162  */
163 UnicodeString &formatInt32(
164         int32_t value,
165         const ValueFormatter &formatter,
166         FieldPositionHandler &handler,
167         const PluralRules *optPluralRules,
168         UnicodeString &appendTo,
169         UErrorCode &status) const;
170
171 private:
172 UnicodeString &appendPadding(int32_t paddingCount, UnicodeString &appendTo) const;
173
174 };
175
176
177 U_NAMESPACE_END
178 #endif /* #if !UCONFIG_NO_FORMATTING */
179 #endif  // __DIGITAFFIXANDPADDING_H__