1 // 2017 and later: Unicode, Inc. and others. 2 // License & terms of use: http://www.unicode.org/copyright.html 3 4 #include "unicode/utypes.h" 5 6 #if !UCONFIG_NO_FORMATTING 7 #ifndef __NUMBER_UTILS_H__ 8 #define __NUMBER_UTILS_H__ 9 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" 19 #include "charstr.h" 20 21 U_NAMESPACE_BEGIN 22 23 namespace number { 24 namespace impl { 25 26 enum CldrPatternStyle { 27 CLDR_PATTERN_STYLE_DECIMAL, 28 CLDR_PATTERN_STYLE_CURRENCY, 29 CLDR_PATTERN_STYLE_ACCOUNTING, 30 CLDR_PATTERN_STYLE_PERCENT, 31 CLDR_PATTERN_STYLE_SCIENTIFIC, 32 CLDR_PATTERN_STYLE_COUNT, 33 }; 34 35 // Namespace for naked functions 36 namespace utils { 37 38 inline int32_t insertDigitFromSymbols(NumberStringBuilder& output, int32_t index, int8_t digit, 39 const DecimalFormatSymbols& symbols, Field field, 40 UErrorCode& status) { 41 if (symbols.getCodePointZero() != -1) { 42 return output.insertCodePoint(index, symbols.getCodePointZero() + digit, field, status); 43 } 44 return output.insert(index, symbols.getConstDigitSymbol(digit), field, status); 45 } 46 47 inline bool unitIsCurrency(const MeasureUnit& unit) { 48 return uprv_strcmp("currency", unit.getType()) == 0; 49 } 50 51 inline bool unitIsNoUnit(const MeasureUnit& unit) { 52 return uprv_strcmp("none", unit.getType()) == 0; 53 } 54 55 inline bool unitIsPercent(const MeasureUnit& unit) { 56 return uprv_strcmp("percent", unit.getSubtype()) == 0; 57 } 58 59 inline bool unitIsPermille(const MeasureUnit& unit) { 60 return uprv_strcmp("permille", unit.getSubtype()) == 0; 61 } 62 63 // NOTE: In Java, this method is in NumberFormat.java 64 const char16_t* 65 getPatternForStyle(const Locale& locale, const char* nsName, CldrPatternStyle style, UErrorCode& status); 66 67 /** 68 * Computes the plural form for this number based on the specified set of rules. 69 * 70 * @param rules A {@link PluralRules} object representing the set of rules. 71 * @return The {@link StandardPlural} according to the PluralRules. If the plural form is not in 72 * the set of standard plurals, {@link StandardPlural#OTHER} is returned instead. 73 */ 74 inline StandardPlural::Form getStandardPlural(const PluralRules *rules, 75 const IFixedDecimal &fdec) { 76 if (rules == nullptr) { 77 // Fail gracefully if the user didn't provide a PluralRules 78 return StandardPlural::Form::OTHER; 79 } else { 80 UnicodeString ruleString = rules->select(fdec); 81 return StandardPlural::orOtherFromString(ruleString); 82 } 83 } 84 85 } // namespace utils 86 87 } // namespace impl 88 } // namespace number 89 90 U_NAMESPACE_END 91 92 #endif //__NUMBER_UTILS_H__ 93 94 #endif /* #if !UCONFIG_NO_FORMATTING */ 95