1 // © 2016 and later: Unicode, Inc. and others.
2 // License & terms of use: http://www.unicode.org/copyright.html
4 * Copyright (C) 2015, International Business Machines
5 * Corporation and others. All Rights Reserved.
7 * file name: digitaffixesandpadding.cpp
10 #include "unicode/utypes.h"
12 #if !UCONFIG_NO_FORMATTING
14 #include "unicode/plurrule.h"
16 #include "digitaffix.h"
17 #include "digitaffixesandpadding.h"
20 #include "valueformatter.h"
21 #include "visibledigits.h"
26 DigitAffixesAndPadding::needsPluralRules() const {
28 fPositivePrefix
.hasMultipleVariants() ||
29 fPositiveSuffix
.hasMultipleVariants() ||
30 fNegativePrefix
.hasMultipleVariants() ||
31 fNegativeSuffix
.hasMultipleVariants());
35 DigitAffixesAndPadding::formatInt32(
37 const ValueFormatter
&formatter
,
38 FieldPositionHandler
&handler
,
39 const PluralRules
*optPluralRules
,
40 UnicodeString
&appendTo
,
41 UErrorCode
&status
) const {
42 if (U_FAILURE(status
)) {
45 if (optPluralRules
!= NULL
|| fWidth
> 0 || !formatter
.isFastFormattable(value
)) {
46 VisibleDigitsWithExponent digits
;
47 formatter
.toVisibleDigitsWithExponent(
48 (int64_t) value
, digits
, status
);
57 UBool bPositive
= value
>= 0;
58 const DigitAffix
*prefix
= bPositive
? &fPositivePrefix
.getOtherVariant() : &fNegativePrefix
.getOtherVariant();
59 const DigitAffix
*suffix
= bPositive
? &fPositiveSuffix
.getOtherVariant() : &fNegativeSuffix
.getOtherVariant();
63 prefix
->format(handler
, appendTo
);
64 formatter
.formatInt32(value
, handler
, appendTo
);
65 return suffix
->format(handler
, appendTo
);
68 static UnicodeString
&
70 const DigitAffix
*affix
,
71 FieldPositionHandler
&handler
,
72 UnicodeString
&appendTo
) {
74 affix
->format(handler
, appendTo
);
80 countAffixChar32(const DigitAffix
*affix
) {
82 return affix
->countChar32();
88 DigitAffixesAndPadding::format(
89 const VisibleDigitsWithExponent
&digits
,
90 const ValueFormatter
&formatter
,
91 FieldPositionHandler
&handler
,
92 const PluralRules
*optPluralRules
,
93 UnicodeString
&appendTo
,
94 UErrorCode
&status
) const {
95 if (U_FAILURE(status
)) {
98 const DigitAffix
*prefix
= NULL
;
99 const DigitAffix
*suffix
= NULL
;
100 if (!digits
.isNaN()) {
101 UBool bPositive
= !digits
.isNegative();
102 const PluralAffix
*pluralPrefix
= bPositive
? &fPositivePrefix
: &fNegativePrefix
;
103 const PluralAffix
*pluralSuffix
= bPositive
? &fPositiveSuffix
: &fNegativeSuffix
;
104 if (optPluralRules
== NULL
|| digits
.isInfinite()) {
105 prefix
= &pluralPrefix
->getOtherVariant();
106 suffix
= &pluralSuffix
->getOtherVariant();
108 UnicodeString
count(optPluralRules
->select(digits
));
109 prefix
= &pluralPrefix
->getByCategory(count
);
110 suffix
= &pluralSuffix
->getByCategory(count
);
114 formatAffix(prefix
, handler
, appendTo
);
115 formatter
.format(digits
, handler
, appendTo
);
116 return formatAffix(suffix
, handler
, appendTo
);
118 int32_t codePointCount
= countAffixChar32(prefix
) + formatter
.countChar32(digits
) + countAffixChar32(suffix
);
119 int32_t paddingCount
= fWidth
- codePointCount
;
120 switch (fPadPosition
) {
121 case kPadBeforePrefix
:
122 appendPadding(paddingCount
, appendTo
);
123 formatAffix(prefix
, handler
, appendTo
);
124 formatter
.format(digits
, handler
, appendTo
);
125 return formatAffix(suffix
, handler
, appendTo
);
126 case kPadAfterPrefix
:
127 formatAffix(prefix
, handler
, appendTo
);
128 appendPadding(paddingCount
, appendTo
);
129 formatter
.format(digits
, handler
, appendTo
);
130 return formatAffix(suffix
, handler
, appendTo
);
131 case kPadBeforeSuffix
:
132 formatAffix(prefix
, handler
, appendTo
);
133 formatter
.format(digits
, handler
, appendTo
);
134 appendPadding(paddingCount
, appendTo
);
135 return formatAffix(suffix
, handler
, appendTo
);
136 case kPadAfterSuffix
:
137 formatAffix(prefix
, handler
, appendTo
);
138 formatter
.format(digits
, handler
, appendTo
);
139 formatAffix(suffix
, handler
, appendTo
);
140 return appendPadding(paddingCount
, appendTo
);
148 DigitAffixesAndPadding::format(
150 const ValueFormatter
&formatter
,
151 FieldPositionHandler
&handler
,
152 const PluralRules
*optPluralRules
,
153 UnicodeString
&appendTo
,
154 UErrorCode
&status
) const {
155 VisibleDigitsWithExponent digits
;
156 formatter
.toVisibleDigitsWithExponent(
157 value
, digits
, status
);
158 if (U_FAILURE(status
)) {
162 digits
, formatter
, handler
, optPluralRules
, appendTo
, status
);
166 DigitAffixesAndPadding::appendPadding(int32_t paddingCount
, UnicodeString
&appendTo
) const {
167 for (int32_t i
= 0; i
< paddingCount
; ++i
) {
168 appendTo
.append(fPadChar
);
175 #endif /* #if !UCONFIG_NO_FORMATTING */