1*0e209d39SAndroid Build Coastguard Worker // © 2017 and later: Unicode, Inc. and others.
2*0e209d39SAndroid Build Coastguard Worker // License & terms of use: http://www.unicode.org/copyright.html
3*0e209d39SAndroid Build Coastguard Worker
4*0e209d39SAndroid Build Coastguard Worker #include "unicode/utypes.h"
5*0e209d39SAndroid Build Coastguard Worker
6*0e209d39SAndroid Build Coastguard Worker #if !UCONFIG_NO_FORMATTING
7*0e209d39SAndroid Build Coastguard Worker #ifndef __NUMBER_UTILS_H__
8*0e209d39SAndroid Build Coastguard Worker #define __NUMBER_UTILS_H__
9*0e209d39SAndroid Build Coastguard Worker
10*0e209d39SAndroid Build Coastguard Worker #include "unicode/numberformatter.h"
11*0e209d39SAndroid Build Coastguard Worker #include "number_types.h"
12*0e209d39SAndroid Build Coastguard Worker #include "number_decimalquantity.h"
13*0e209d39SAndroid Build Coastguard Worker #include "number_scientific.h"
14*0e209d39SAndroid Build Coastguard Worker #include "number_patternstring.h"
15*0e209d39SAndroid Build Coastguard Worker #include "number_modifiers.h"
16*0e209d39SAndroid Build Coastguard Worker #include "number_multiplier.h"
17*0e209d39SAndroid Build Coastguard Worker #include "number_roundingutils.h"
18*0e209d39SAndroid Build Coastguard Worker #include "decNumber.h"
19*0e209d39SAndroid Build Coastguard Worker #include "charstr.h"
20*0e209d39SAndroid Build Coastguard Worker #include "formatted_string_builder.h"
21*0e209d39SAndroid Build Coastguard Worker
22*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_BEGIN
23*0e209d39SAndroid Build Coastguard Worker
24*0e209d39SAndroid Build Coastguard Worker namespace number::impl {
25*0e209d39SAndroid Build Coastguard Worker
26*0e209d39SAndroid Build Coastguard Worker enum CldrPatternStyle {
27*0e209d39SAndroid Build Coastguard Worker CLDR_PATTERN_STYLE_DECIMAL,
28*0e209d39SAndroid Build Coastguard Worker CLDR_PATTERN_STYLE_CURRENCY,
29*0e209d39SAndroid Build Coastguard Worker CLDR_PATTERN_STYLE_ACCOUNTING,
30*0e209d39SAndroid Build Coastguard Worker CLDR_PATTERN_STYLE_PERCENT,
31*0e209d39SAndroid Build Coastguard Worker CLDR_PATTERN_STYLE_SCIENTIFIC,
32*0e209d39SAndroid Build Coastguard Worker CLDR_PATTERN_STYLE_COUNT,
33*0e209d39SAndroid Build Coastguard Worker };
34*0e209d39SAndroid Build Coastguard Worker
35*0e209d39SAndroid Build Coastguard Worker // Namespace for naked functions
36*0e209d39SAndroid Build Coastguard Worker namespace utils {
37*0e209d39SAndroid Build Coastguard Worker
insertDigitFromSymbols(FormattedStringBuilder & output,int32_t index,int8_t digit,const DecimalFormatSymbols & symbols,Field field,UErrorCode & status)38*0e209d39SAndroid Build Coastguard Worker inline int32_t insertDigitFromSymbols(FormattedStringBuilder& output, int32_t index, int8_t digit,
39*0e209d39SAndroid Build Coastguard Worker const DecimalFormatSymbols& symbols, Field field,
40*0e209d39SAndroid Build Coastguard Worker UErrorCode& status) {
41*0e209d39SAndroid Build Coastguard Worker if (symbols.getCodePointZero() != -1) {
42*0e209d39SAndroid Build Coastguard Worker return output.insertCodePoint(index, symbols.getCodePointZero() + digit, field, status);
43*0e209d39SAndroid Build Coastguard Worker }
44*0e209d39SAndroid Build Coastguard Worker return output.insert(index, symbols.getConstDigitSymbol(digit), field, status);
45*0e209d39SAndroid Build Coastguard Worker }
46*0e209d39SAndroid Build Coastguard Worker
unitIsCurrency(const MeasureUnit & unit)47*0e209d39SAndroid Build Coastguard Worker inline bool unitIsCurrency(const MeasureUnit& unit) {
48*0e209d39SAndroid Build Coastguard Worker return uprv_strcmp("currency", unit.getType()) == 0;
49*0e209d39SAndroid Build Coastguard Worker }
50*0e209d39SAndroid Build Coastguard Worker
unitIsBaseUnit(const MeasureUnit & unit)51*0e209d39SAndroid Build Coastguard Worker inline bool unitIsBaseUnit(const MeasureUnit& unit) {
52*0e209d39SAndroid Build Coastguard Worker return unit == MeasureUnit();
53*0e209d39SAndroid Build Coastguard Worker }
54*0e209d39SAndroid Build Coastguard Worker
unitIsPercent(const MeasureUnit & unit)55*0e209d39SAndroid Build Coastguard Worker inline bool unitIsPercent(const MeasureUnit& unit) {
56*0e209d39SAndroid Build Coastguard Worker return uprv_strcmp("percent", unit.getSubtype()) == 0;
57*0e209d39SAndroid Build Coastguard Worker }
58*0e209d39SAndroid Build Coastguard Worker
unitIsPermille(const MeasureUnit & unit)59*0e209d39SAndroid Build Coastguard Worker inline bool unitIsPermille(const MeasureUnit& unit) {
60*0e209d39SAndroid Build Coastguard Worker return uprv_strcmp("permille", unit.getSubtype()) == 0;
61*0e209d39SAndroid Build Coastguard Worker }
62*0e209d39SAndroid Build Coastguard Worker
63*0e209d39SAndroid Build Coastguard Worker // NOTE: In Java, this method is in NumberFormat.java
64*0e209d39SAndroid Build Coastguard Worker const char16_t*
65*0e209d39SAndroid Build Coastguard Worker getPatternForStyle(const Locale& locale, const char* nsName, CldrPatternStyle style, UErrorCode& status);
66*0e209d39SAndroid Build Coastguard Worker
67*0e209d39SAndroid Build Coastguard Worker /**
68*0e209d39SAndroid Build Coastguard Worker * Computes the plural form for this number based on the specified set of rules.
69*0e209d39SAndroid Build Coastguard Worker *
70*0e209d39SAndroid Build Coastguard Worker * @param rules A {@link PluralRules} object representing the set of rules.
71*0e209d39SAndroid Build Coastguard Worker * @return The {@link StandardPlural} according to the PluralRules. If the plural form is not in
72*0e209d39SAndroid Build Coastguard Worker * the set of standard plurals, {@link StandardPlural#OTHER} is returned instead.
73*0e209d39SAndroid Build Coastguard Worker */
getStandardPlural(const PluralRules * rules,const IFixedDecimal & fdec)74*0e209d39SAndroid Build Coastguard Worker inline StandardPlural::Form getStandardPlural(const PluralRules *rules,
75*0e209d39SAndroid Build Coastguard Worker const IFixedDecimal &fdec) {
76*0e209d39SAndroid Build Coastguard Worker if (rules == nullptr) {
77*0e209d39SAndroid Build Coastguard Worker // Fail gracefully if the user didn't provide a PluralRules
78*0e209d39SAndroid Build Coastguard Worker return StandardPlural::Form::OTHER;
79*0e209d39SAndroid Build Coastguard Worker } else {
80*0e209d39SAndroid Build Coastguard Worker UnicodeString ruleString = rules->select(fdec);
81*0e209d39SAndroid Build Coastguard Worker return StandardPlural::orOtherFromString(ruleString);
82*0e209d39SAndroid Build Coastguard Worker }
83*0e209d39SAndroid Build Coastguard Worker }
84*0e209d39SAndroid Build Coastguard Worker
85*0e209d39SAndroid Build Coastguard Worker /**
86*0e209d39SAndroid Build Coastguard Worker * Computes the plural form after copying the number and applying rounding rules.
87*0e209d39SAndroid Build Coastguard Worker */
getPluralSafe(const RoundingImpl & rounder,const PluralRules * rules,const DecimalQuantity & dq,UErrorCode & status)88*0e209d39SAndroid Build Coastguard Worker inline StandardPlural::Form getPluralSafe(
89*0e209d39SAndroid Build Coastguard Worker const RoundingImpl& rounder,
90*0e209d39SAndroid Build Coastguard Worker const PluralRules* rules,
91*0e209d39SAndroid Build Coastguard Worker const DecimalQuantity& dq,
92*0e209d39SAndroid Build Coastguard Worker UErrorCode& status) {
93*0e209d39SAndroid Build Coastguard Worker // TODO(ICU-20500): Avoid the copy?
94*0e209d39SAndroid Build Coastguard Worker DecimalQuantity copy(dq);
95*0e209d39SAndroid Build Coastguard Worker rounder.apply(copy, status);
96*0e209d39SAndroid Build Coastguard Worker if (U_FAILURE(status)) {
97*0e209d39SAndroid Build Coastguard Worker return StandardPlural::Form::OTHER;
98*0e209d39SAndroid Build Coastguard Worker }
99*0e209d39SAndroid Build Coastguard Worker return getStandardPlural(rules, copy);
100*0e209d39SAndroid Build Coastguard Worker }
101*0e209d39SAndroid Build Coastguard Worker
102*0e209d39SAndroid Build Coastguard Worker } // namespace utils
103*0e209d39SAndroid Build Coastguard Worker
104*0e209d39SAndroid Build Coastguard Worker } // namespace number::impl
105*0e209d39SAndroid Build Coastguard Worker
106*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_END
107*0e209d39SAndroid Build Coastguard Worker
108*0e209d39SAndroid Build Coastguard Worker #endif //__NUMBER_UTILS_H__
109*0e209d39SAndroid Build Coastguard Worker
110*0e209d39SAndroid Build Coastguard Worker #endif /* #if !UCONFIG_NO_FORMATTING */
111