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