4 #ifndef __NUMBERFORMATTER_H__
5 #define __NUMBERFORMATTER_H__
9 #if U_SHOW_CPLUSPLUS_API
11 #if !UCONFIG_NO_FORMATTING
89 class FieldPositionIteratorHandler;
90 class FormattedStringBuilder;
96 class NumberParserImpl;
97 class MultiplierParseHandler;
112 class UnlocalizedNumberFormatter;
113 class LocalizedNumberFormatter;
114 class FormattedNumber;
116 class ScientificNotation;
118 class FractionPrecision;
119 class CurrencyPrecision;
120 class IncrementPrecision;
140 static constexpr int32_t kInternalDefaultThreshold = 3;
146 class DecimalQuantity;
147 class UFormattedNumberData;
148 class NumberFormatterImpl;
149 struct ParsedPatternInfo;
150 class ScientificModifier;
151 class MultiplierProducer;
153 class ScientificHandler;
155 class AffixPatternProvider;
156 class NumberPropertyMapper;
157 struct DecimalFormatProperties;
158 class MultiplierFormatHandler;
159 class CurrencySymbols;
160 class GeneratorHelpers;
162 class NumberRangeFormatterImpl;
164 struct UFormattedNumberImpl;
165 class MutablePatternModifier;
166 class ImmutablePatternModifier;
167 struct DecimalFormatWarehouse;
345 NTN_SCIENTIFIC, NTN_COMPACT, NTN_SIMPLE, NTN_ERROR
348 union NotationUnion {
371 Notation(
const NotationType &type,
const NotationUnion &union_) : fType(type), fUnion(union_) {}
374 fUnion.errorCode = errorCode;
377 Notation() : fType(NTN_SIMPLE), fUnion() {}
380 if (fType == NTN_ERROR) {
381 status = fUnion.errorCode;
388 friend struct impl::MacroProps;
389 friend class ScientificNotation;
392 friend class impl::NumberFormatterImpl;
393 friend class impl::ScientificModifier;
394 friend class impl::ScientificHandler;
397 friend class impl::GeneratorHelpers;
442 using Notation::Notation;
451 friend class impl::NumberPropertyMapper;
568 static FractionPrecision minMaxFraction(int32_t minFractionPlaces, int32_t maxFractionPlaces);
621 int32_t maxSignificantDigits);
669 RND_FRACTION_SIGNIFICANT,
686 union PrecisionUnion {
716 Precision(
const PrecisionType& type,
const PrecisionUnion& union_)
717 : fType(type), fUnion(union_) {}
720 fUnion.errorCode = errorCode;
723 Precision() : fType(RND_BOGUS) {}
725 bool isBogus()
const {
726 return fType == RND_BOGUS;
730 if (fType == RND_ERROR) {
731 status = fUnion.errorCode;
738 Precision withCurrency(
const CurrencyUnit ¤cy,
UErrorCode &status)
const;
740 static FractionPrecision constructFraction(int32_t minFrac, int32_t maxFrac);
742 static Precision constructSignificant(int32_t minSig, int32_t maxSig);
745 constructFractionSignificant(
const FractionPrecision &base, int32_t minSig, int32_t maxSig);
747 static IncrementPrecision constructIncrement(
double increment, int32_t minFrac);
752 friend struct impl::MacroProps;
753 friend struct impl::MicroProps;
756 friend class impl::NumberFormatterImpl;
759 friend class impl::NumberPropertyMapper;
762 friend class impl::RoundingImpl;
765 friend class FractionPrecision;
766 friend class CurrencyPrecision;
767 friend class IncrementPrecision;
770 friend class impl::GeneratorHelpers;
773 friend class units::UnitsRouter;
803 Precision withMinDigits(int32_t minSignificantDigits)
const;
822 Precision withMaxDigits(int32_t maxSignificantDigits)
const;
826 using Precision::Precision;
864 using Precision::Precision;
896 Precision withMinFraction(int32_t minFrac)
const;
900 using Precision::Precision;
948 bool fFormatFailIfMoreThanMaxDigits;
952 bool fHasError =
false;
957 fUnion.errorCode = errorCode;
962 fUnion.minMaxInt.fMinInt = -1;
967 return IntegerWidth::zeroFillTo(1);
970 bool isBogus()
const {
971 return !fHasError && fUnion.minMaxInt.fMinInt == -1;
976 status = fUnion.errorCode;
982 void apply(impl::DecimalQuantity &quantity,
UErrorCode &status)
const;
988 friend struct impl::MicroProps;
991 friend class impl::NumberFormatterImpl;
994 friend class impl::MutablePatternModifier;
995 friend class impl::ImmutablePatternModifier;
998 friend class impl::NumberPropertyMapper;
1001 friend class impl::GeneratorHelpers;
1020 static Scale none();
1032 static Scale powerOfTen(int32_t power);
1056 static Scale byDouble(
double multiplicand);
1064 static Scale byDoubleAndPowerOfTen(
double multiplicand, int32_t power);
1084 #ifndef U_HIDE_INTERNAL_API
1086 Scale(int32_t magnitude, impl::DecNum* arbitraryToAdopt);
1091 impl::DecNum* fArbitrary;
1094 Scale(
UErrorCode error) : fMagnitude(0), fArbitrary(
nullptr), fError(error) {}
1098 bool isValid()
const {
1099 return fMagnitude != 0 || fArbitrary !=
nullptr;
1110 void applyTo(impl::DecimalQuantity& quantity)
const;
1112 void applyReciprocalTo(impl::DecimalQuantity& quantity)
const;
1116 friend struct impl::MicroProps;
1119 friend class impl::NumberFormatterImpl;
1122 friend class impl::MultiplierFormatHandler;
1125 friend class impl::GeneratorHelpers;
1128 friend class ::icu::numparse::impl::NumberParserImpl;
1129 friend class ::icu::numparse::impl::MultiplierParseHandler;
1141 #ifndef U_HIDE_INTERNAL_API
1168 bool isSet()
const {
return fLength > 0; }
1170 #endif // U_HIDE_INTERNAL_API
1189 friend class impl::NumberFormatterImpl;
1192 friend class impl::GeneratorHelpers;
1196 friend struct impl::MacroProps;
1207 SymbolsWrapper(
const SymbolsWrapper &other);
1210 SymbolsWrapper &operator=(
const SymbolsWrapper &other);
1213 SymbolsWrapper(SymbolsWrapper&& src)
U_NOEXCEPT;
1216 SymbolsWrapper &operator=(SymbolsWrapper&& src)
U_NOEXCEPT;
1221 #ifndef U_HIDE_INTERNAL_API
1239 bool isDecimalFormatSymbols()
const;
1245 bool isNumberingSystem()
const;
1259 #endif // U_HIDE_INTERNAL_API
1263 if (fType == SYMPTR_DFS && fPtr.dfs ==
nullptr) {
1266 }
else if (fType == SYMPTR_NS && fPtr.ns ==
nullptr) {
1274 enum SymbolsPointerType {
1275 SYMPTR_NONE, SYMPTR_DFS, SYMPTR_NS
1283 void doCopyFrom(
const SymbolsWrapper &other);
1285 void doMoveFrom(SymbolsWrapper&& src);
1294 #ifndef U_HIDE_INTERNAL_API
1302 static Grouper forProperties(
const DecimalFormatProperties& properties);
1308 : fGrouping1(grouping1),
1309 fGrouping2(grouping2),
1310 fMinGrouping(minGrouping),
1311 fStrategy(strategy) {}
1314 int16_t getPrimary()
const;
1317 int16_t getSecondary()
const;
1318 #endif // U_HIDE_INTERNAL_API
1339 int16_t fMinGrouping;
1349 bool isBogus()
const {
1350 return fGrouping1 == -3;
1354 void setLocaleData(
const impl::ParsedPatternInfo &patternInfo,
const Locale& locale);
1356 bool groupAtPosition(int32_t position,
const impl::DecimalQuantity &value)
const;
1359 friend struct MacroProps;
1360 friend struct MicroProps;
1363 friend class NumberFormatterImpl;
1366 friend class ::icu::numparse::impl::NumberParserImpl;
1369 friend class impl::GeneratorHelpers;
1376 #ifndef U_HIDE_INTERNAL_API
1384 static Padder forProperties(
const DecimalFormatProperties& properties);
1385 #endif // U_HIDE_INTERNAL_API
1402 fUnion.errorCode = errorCode;
1407 bool isBogus()
const {
1408 return fWidth == -2;
1413 status = fUnion.errorCode;
1419 bool isValid()
const {
1423 int32_t padAndApply(
const impl::Modifier &mod1,
const impl::Modifier &mod2,
1424 FormattedStringBuilder &
string, int32_t leftIndex, int32_t rightIndex,
1429 friend struct MicroProps;
1432 friend class impl::NumberFormatterImpl;
1435 friend class impl::GeneratorHelpers;
1486 const AffixPatternProvider* affixProvider =
nullptr;
1492 int32_t threshold = kInternalDefaultThreshold;
1504 return notation.copyErrorTo(status) || precision.copyErrorTo(status) ||
1505 padder.copyErrorTo(status) || integerWidth.copyErrorTo(status) ||
1506 symbols.
copyErrorTo(status) || scale.copyErrorTo(status) || usage.copyErrorTo(status);
1512 #if (U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN) && defined(_MSC_VER)
1518 #pragma warning(push)
1519 #pragma warning(disable: 4661)
1527 template<
typename Derived>
1558 Derived notation(
const Notation ¬ation)
const &;
1569 Derived notation(
const Notation ¬ation) &&;
1749 Derived precision(
const Precision& precision)
const &;
1760 Derived precision(
const Precision& precision) &&;
1856 Derived integerWidth(
const IntegerWidth &style)
const &;
2106 Derived scale(
const Scale &scale)
const &;
2117 Derived scale(
const Scale &scale) &&;
2119 #ifndef U_HIDE_DRAFT_API
2172 #endif // U_HIDE_DRAFT_API
2174 #ifndef U_HIDE_INTERNAL_API
2192 Derived threshold(int32_t threshold)
const &;
2195 Derived threshold(int32_t threshold) &&;
2264 fMacros.copyErrorTo(outErrorCode);
2281 friend class impl::NumberRangeFormatterImpl;
2417 #ifndef U_HIDE_INTERNAL_API
2433 const impl::NumberFormatterImpl* getCompiled()
const;
2439 int32_t getCallCount()
const;
2491 #ifndef U_HIDE_INTERNAL_API
2505 void formatImpl(impl::UFormattedNumberData *results,
UErrorCode &status)
const;
2518 const impl::NumberFormatterImpl* fCompiled {
nullptr};
2519 char fUnsafeCallCount[8] {};
2523 const impl::DecimalFormatWarehouse* fWarehouse {
nullptr};
2533 void resetCompiled();
2542 bool computeCompiled(
UErrorCode& status)
const;
2552 #if (U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN) && defined(_MSC_VER)
2554 #pragma warning(pop)
2645 template<typename StringClass>
2646 inline StringClass toDecimalNumber(
UErrorCode& status) const;
2648 #ifndef U_HIDE_DRAFT_API
2661 #endif // U_HIDE_DRAFT_API
2663 #ifndef U_HIDE_INTERNAL_API
2669 void getDecimalQuantity(impl::DecimalQuantity& output,
UErrorCode& status)
const;
2675 void getAllFieldPositionsImpl(FieldPositionIteratorHandler& fpih,
UErrorCode& status)
const;
2681 const impl::UFormattedNumberData *fData;
2693 explicit FormattedNumber(
UErrorCode errorCode)
2694 : fData(nullptr), fErrorCode(errorCode) {}
2696 void toDecimalNumber(ByteSink& sink,
UErrorCode& status)
const;
2699 friend class LocalizedNumberFormatter;
2702 friend struct impl::UFormattedNumberImpl;
2705 #ifndef U_HIDE_DRAFT_API
2707 template<
typename StringClass>
2708 StringClass FormattedNumber::toDecimalNumber(
UErrorCode& status)
const {
2711 toDecimalNumber(sink, status);
2714 #endif // U_HIDE_DRAFT_API
2792 #endif // __NUMBERFORMATTER_H__