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