| // © 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 */ |