1 // © 2017 and later: Unicode, Inc. and others.
2 // License & terms of use: http://www.unicode.org/copyright.html
4 #include "unicode/utypes.h"
6 #if !UCONFIG_NO_FORMATTING
7 #ifndef __NUMBER_UTILS_H__
8 #define __NUMBER_UTILS_H__
10 #include "unicode/numberformatter.h"
11 #include "number_types.h"
12 #include "number_decimalquantity.h"
13 #include "number_scientific.h"
14 #include "number_patternstring.h"
15 #include "number_modifiers.h"
16 #include "number_multiplier.h"
17 #include "number_roundingutils.h"
18 #include "decNumber.h"
20 #include "formatted_string_builder.h"
27 enum CldrPatternStyle
{
28 CLDR_PATTERN_STYLE_DECIMAL
,
29 CLDR_PATTERN_STYLE_CURRENCY
,
30 CLDR_PATTERN_STYLE_ACCOUNTING
,
31 CLDR_PATTERN_STYLE_PERCENT
,
32 CLDR_PATTERN_STYLE_SCIENTIFIC
,
33 CLDR_PATTERN_STYLE_COUNT
,
36 // Namespace for naked functions
39 inline int32_t insertDigitFromSymbols(FormattedStringBuilder
& output
, int32_t index
, int8_t digit
,
40 const DecimalFormatSymbols
& symbols
, Field field
,
42 if (symbols
.getCodePointZero() != -1) {
43 return output
.insertCodePoint(index
, symbols
.getCodePointZero() + digit
, field
, status
);
45 return output
.insert(index
, symbols
.getConstDigitSymbol(digit
), field
, status
);
48 inline bool unitIsCurrency(const MeasureUnit
& unit
) {
49 return uprv_strcmp("currency", unit
.getType()) == 0;
52 inline bool unitIsNoUnit(const MeasureUnit
& unit
) {
53 return uprv_strcmp("none", unit
.getType()) == 0;
56 inline bool unitIsPercent(const MeasureUnit
& unit
) {
57 return uprv_strcmp("percent", unit
.getSubtype()) == 0;
60 inline bool unitIsPermille(const MeasureUnit
& unit
) {
61 return uprv_strcmp("permille", unit
.getSubtype()) == 0;
64 // NOTE: In Java, this method is in NumberFormat.java
66 getPatternForStyle(const Locale
& locale
, const char* nsName
, CldrPatternStyle style
, UErrorCode
& status
);
69 * Computes the plural form for this number based on the specified set of rules.
71 * @param rules A {@link PluralRules} object representing the set of rules.
72 * @return The {@link StandardPlural} according to the PluralRules. If the plural form is not in
73 * the set of standard plurals, {@link StandardPlural#OTHER} is returned instead.
75 inline StandardPlural::Form
getStandardPlural(const PluralRules
*rules
,
76 const IFixedDecimal
&fdec
) {
77 if (rules
== nullptr) {
78 // Fail gracefully if the user didn't provide a PluralRules
79 return StandardPlural::Form::OTHER
;
81 UnicodeString ruleString
= rules
->select(fdec
);
82 return StandardPlural::orOtherFromString(ruleString
);
87 * Computes the plural form after copying the number and applying rounding rules.
89 inline StandardPlural::Form
getPluralSafe(
90 const RoundingImpl
& rounder
,
91 const PluralRules
* rules
,
92 const DecimalQuantity
& dq
,
94 // TODO(ICU-20500): Avoid the copy?
95 DecimalQuantity
copy(dq
);
96 rounder
.apply(copy
, status
);
97 if (U_FAILURE(status
)) {
98 return StandardPlural::Form::OTHER
;
100 return getStandardPlural(rules
, copy
);
106 } // namespace number
110 #endif //__NUMBER_UTILS_H__
112 #endif /* #if !UCONFIG_NO_FORMATTING */