6#if !UCONFIG_NO_FORMATTING
7#ifndef __NUMBERFORMATTER_H__
8#define __NUMBERFORMATTER_H__
23#ifndef U_HIDE_DRAFT_API
83class FieldPositionIteratorHandler;
89class NumberParserImpl;
90class MultiplierParseHandler;
98class UnlocalizedNumberFormatter;
99class LocalizedNumberFormatter;
100class FormattedNumber;
102class ScientificNotation;
104class FractionPrecision;
105class CurrencyPrecision;
106class IncrementPrecision;
124static constexpr int32_t DEFAULT_THRESHOLD = 3;
132class NumberFormatterImpl;
134class ScientificModifier;
137class ScientificHandler;
141class NumberPropertyMapper;
143class MultiplierFormatHandler;
145class GeneratorHelpers;
306 NTN_SCIENTIFIC, NTN_COMPACT, NTN_SIMPLE, NTN_ERROR
309 union NotationUnion {
312 int8_t fEngineeringInterval;
327 Notation(
const NotationType &type,
const NotationUnion &
union_) : fType(type), fUnion(
union_) {}
330 fUnion.errorCode = errorCode;
333 Notation() : fType(NTN_SIMPLE), fUnion() {}
336 if (fType == NTN_ERROR) {
337 status = fUnion.errorCode;
344 friend struct impl::MacroProps;
345 friend class ScientificNotation;
348 friend class impl::NumberFormatterImpl;
349 friend class impl::ScientificModifier;
350 friend class impl::ScientificHandler;
353 friend class impl::GeneratorHelpers;
398 using Notation::Notation;
407 friend class impl::NumberPropertyMapper;
580 int32_t maxSignificantDigits);
582#ifndef U_HIDE_DEPRECATED_API
588 return fixedSignificantDigits(a);
593 return minSignificantDigits(a);
598 return maxSignificantDigits(a);
603 return minMaxSignificantDigits(a, b);
647#ifndef U_HIDE_DEPRECATED_API
668 RND_FRACTION_SIGNIFICANT,
674 union PrecisionUnion {
699 : fType(type), fUnion(
union_), fRoundingMode(roundingMode) {}
702 fUnion.errorCode = errorCode;
705 Precision() : fType(RND_BOGUS) {}
707 bool isBogus()
const {
708 return fType == RND_BOGUS;
712 if (fType == RND_ERROR) {
713 status = fUnion.errorCode;
720 Precision withCurrency(
const CurrencyUnit ¤cy,
UErrorCode &status)
const;
722 static FractionPrecision constructFraction(int32_t minFrac, int32_t maxFrac);
724 static Precision constructSignificant(int32_t minSig, int32_t maxSig);
727 constructFractionSignificant(
const FractionPrecision &base, int32_t minSig, int32_t maxSig);
729 static IncrementPrecision constructIncrement(
double increment, int32_t minFrac);
733 static Precision constructPassThrough();
736 friend struct impl::MacroProps;
737 friend struct impl::MicroProps;
740 friend class impl::NumberFormatterImpl;
743 friend class impl::NumberPropertyMapper;
746 friend class impl::RoundingImpl;
749 friend class FractionPrecision;
750 friend class CurrencyPrecision;
751 friend class IncrementPrecision;
754 friend class impl::GeneratorHelpers;
807 using Precision::Precision;
845 using Precision::Precision;
881 using Precision::Precision;
929 bool fFormatFailIfMoreThanMaxDigits;
933 bool fHasError =
false;
938 fUnion.errorCode = errorCode;
943 fUnion.minMaxInt.fMinInt = -1;
947 static IntegerWidth standard() {
948 return IntegerWidth::zeroFillTo(1);
951 bool isBogus()
const {
952 return !fHasError && fUnion.minMaxInt.fMinInt == -1;
957 status = fUnion.errorCode;
963 void apply(impl::DecimalQuantity &quantity,
UErrorCode &status)
const;
965 bool operator==(
const IntegerWidth& other)
const;
968 friend struct impl::MacroProps;
969 friend struct impl::MicroProps;
972 friend class impl::NumberFormatterImpl;
975 friend class impl::NumberPropertyMapper;
978 friend class impl::GeneratorHelpers;
1061#ifndef U_HIDE_INTERNAL_API
1068 impl::DecNum* fArbitrary;
1075 bool isValid()
const {
1076 return fMagnitude != 0 || fArbitrary !=
nullptr;
1087 void applyTo(impl::DecimalQuantity& quantity)
const;
1089 void applyReciprocalTo(impl::DecimalQuantity& quantity)
const;
1092 friend struct impl::MacroProps;
1093 friend struct impl::MicroProps;
1096 friend class impl::NumberFormatterImpl;
1099 friend class impl::MultiplierFormatHandler;
1102 friend class impl::GeneratorHelpers;
1105 friend class ::icu::numparse::impl::NumberParserImpl;
1106 friend class ::icu::numparse::impl::MultiplierParseHandler;
1133#ifndef U_HIDE_INTERNAL_API
1175 if (fType == SYMPTR_DFS && fPtr.dfs ==
nullptr) {
1178 }
else if (fType == SYMPTR_NS && fPtr.ns ==
nullptr) {
1186 enum SymbolsPointerType {
1187 SYMPTR_NONE, SYMPTR_DFS, SYMPTR_NS
1195 void doCopyFrom(
const SymbolsWrapper &
other);
1197 void doMoveFrom(SymbolsWrapper&&
src);
1206#ifndef U_HIDE_INTERNAL_API
1251 int16_t fMinGrouping;
1259 Grouper() : fGrouping1(-3) {};
1261 bool isBogus()
const {
1262 return fGrouping1 == -3;
1266 void setLocaleData(
const impl::ParsedPatternInfo &
patternInfo,
const Locale& locale);
1268 bool groupAtPosition(int32_t
position,
const impl::DecimalQuantity &value)
const;
1271 friend struct MacroProps;
1272 friend struct MicroProps;
1275 friend class NumberFormatterImpl;
1278 friend class ::icu::numparse::impl::NumberParserImpl;
1281 friend class impl::GeneratorHelpers;
1288#ifndef U_HIDE_INTERNAL_API
1311 Padder(int32_t width);
1314 fUnion.errorCode = errorCode;
1317 Padder() : fWidth(-2) {}
1319 bool isBogus()
const {
1320 return fWidth == -2;
1325 status = fUnion.errorCode;
1331 bool isValid()
const {
1335 int32_t padAndApply(
const impl::Modifier &mod1,
const impl::Modifier &mod2,
1336 impl::NumberStringBuilder &
string, int32_t leftIndex, int32_t rightIndex,
1340 friend struct MacroProps;
1341 friend struct MicroProps;
1344 friend class impl::NumberFormatterImpl;
1347 friend class impl::GeneratorHelpers;
1404 int32_t threshold = DEFAULT_THRESHOLD;
1416 return notation.copyErrorTo(
status) || precision.copyErrorTo(
status) ||
1417 padder.copyErrorTo(
status) || integerWidth.copyErrorTo(
status) ||
1428template<
typename Derived>
1660#ifndef U_HIDE_DEPRECATED_API
2028#ifndef U_HIDE_INTERNAL_API
2250#ifndef U_HIDE_INTERNAL_API
2325#ifndef U_HIDE_INTERNAL_API
2351 const impl::NumberFormatterImpl* fCompiled {
nullptr};
2352 char fUnsafeCallCount[8] {};
2358 LocalizedNumberFormatter(
const impl::MacroProps ¯os,
const Locale &locale);
2360 LocalizedNumberFormatter(impl::MacroProps &¯os,
const Locale &locale);
2362 void lnfMoveHelper(LocalizedNumberFormatter&&
src);
2370 friend class NumberFormatterSettings<UnlocalizedNumberFormatter>;
2371 friend class NumberFormatterSettings<LocalizedNumberFormatter>;
2374 friend class UnlocalizedNumberFormatter;
2385#ifndef U_HIDE_DEPRECATED_API
2407#ifndef U_HIDE_DEPRECATED_API
2435#ifndef U_HIDE_DEPRECATED_API
2492#ifndef U_HIDE_DEPRECATED_API
2526#ifndef U_HIDE_INTERNAL_API
2574 const impl::UFormattedNumberData *fResults;
2587 : fResults(
nullptr), fErrorCode(errorCode) {};
2590 friend class LocalizedNumberFormatter;
C++ API: Appendable class: Sink for Unicode code points and 16-bit code units (char16_ts).
Base class for objects to which Unicode characters and strings can be appended.
A unit of currency, such as USD (U.S.
FieldPositionIterator returns the field ids and their start/limit positions generated by a call to Fo...
FieldPosition is a simple class used by Format and its subclasses to identify fields in formatted out...
"Smart pointer" base class; do not use directly: use LocalPointer etc.
A Locale object represents a specific geographical, political, or cultural region.
A unit such as length, mass, volume, currency, etc.
Defines numbering systems.
Defines rules for mapping non-negative numeric values onto a small set of keywords.
A string-like object that points to a sized piece of memory.
UMemory is the common ICU base class.
UnicodeString is a string class that stores Unicode characters directly and provides similar function...
A class that defines a rounding precision parameterized by a currency to be used when formatting numb...
Precision withCurrency(const CurrencyUnit ¤cy) const
Associates a currency with this rounding precision.
A class that defines a rounding precision based on a number of fraction places and optionally signifi...
Precision withMinDigits(int32_t minSignificantDigits) const
Ensure that no less than this number of significant digits are retained when rounding according to fr...
Precision withMaxDigits(int32_t maxSignificantDigits) const
Ensure that no more than this number of significant digits are retained when rounding according to fr...
A class that defines a rounding precision parameterized by a rounding increment to be used when forma...
Precision withMinFraction(int32_t minFrac) const
Specifies the minimum number of fraction digits to render after the decimal separator,...
A class that defines the strategy for padding and truncating integers before the decimal separator.
static IntegerWidth zeroFillTo(int32_t minInt)
Pad numbers at the beginning with zeros to guarantee a certain number of numerals before the decimal ...
IntegerWidth truncateAt(int32_t maxInt)
Truncate numbers exceeding a certain number of numerals before the decimal separator.
A class that defines the notation style to be used when formatting numbers in NumberFormatter.
static CompactNotation compactShort()
Print the number using short-form compact notation.
static ScientificNotation engineering()
Print the number using engineering notation, a variant of scientific notation in which the exponent m...
static CompactNotation compactLong()
Print the number using long-form compact notation.
static SimpleNotation simple()
Print the number using simple notation without any scaling by powers of ten.
static ScientificNotation scientific()
Print the number using scientific notation (also known as scientific form, standard index form,...
A class that defines the rounding precision to be used when formatting numbers in NumberFormatter.
static SignificantDigitsPrecision maxSignificantDigits(int32_t maxSignificantDigits)
Show numbers rounded if necessary to a certain number of significant digits/figures.
static FractionPrecision fixedFraction(int32_t minMaxFractionPlaces)
Show numbers rounded if necessary to a certain number of fraction places (numerals after the decimal ...
static SignificantDigitsPrecision minSignificantDigits(int32_t minSignificantDigits)
Always show at least a certain number of significant digits/figures, padding with zeros if necessary.
Precision withMode(UNumberFormatRoundingMode roundingMode) const
Sets the rounding mode to use when picking the direction to round (up or down).
static FractionPrecision maxFraction(int32_t maxFractionPlaces)
Show numbers rounded if necessary to a certain number of fraction places (numerals after the decimal ...
static SignificantDigitsPrecision minMaxDigits(int32_t a, int32_t b)
static IncrementPrecision increment(double roundingIncrement)
Show numbers rounded if necessary to the closest multiple of a certain rounding increment.
static CurrencyPrecision currency(UCurrencyUsage currencyUsage)
Show numbers rounded and padded according to the rules for the currency unit.
static FractionPrecision minFraction(int32_t minFractionPlaces)
Always show at least a certain number of fraction places after the decimal separator,...
static SignificantDigitsPrecision fixedDigits(int32_t a)
static Precision unlimited()
Show all available digits to full precision.
static FractionPrecision integer()
Show numbers rounded if necessary to the nearest integer.
static SignificantDigitsPrecision fixedSignificantDigits(int32_t minMaxSignificantDigits)
Show numbers rounded if necessary to a certain number of significant digits or significant figures.
static SignificantDigitsPrecision minDigits(int32_t a)
static SignificantDigitsPrecision maxDigits(int32_t a)
static FractionPrecision minMaxFraction(int32_t minFractionPlaces, int32_t maxFractionPlaces)
Show numbers rounded if necessary to a certain number of fraction places (numerals after the decimal ...
static SignificantDigitsPrecision minMaxSignificantDigits(int32_t minSignificantDigits, int32_t maxSignificantDigits)
Show numbers rounded if necessary to a certain number of significant digits/figures; in addition,...
A class that defines a quantity by which a number should be multiplied when formatting.
static Scale none()
Do not change the value of numbers when formatting or parsing.
static Scale powerOfTen(int32_t power)
Multiply numbers by a power of ten before formatting.
Scale(const Scale &other)
static Scale byDoubleAndPowerOfTen(double multiplicand, int32_t power)
Multiply a number by both a power of ten and by an arbitrary double value.
static Scale byDecimal(StringPiece multiplicand)
Multiply numbers by an arbitrary value before formatting.
Scale(int32_t magnitude, impl::DecNum *arbitraryToAdopt)
Scale & operator=(const Scale &other)
Scale & operator=(Scale &&src)
static Scale byDouble(double multiplicand)
Multiply numbers by an arbitrary value before formatting.
A class that defines the scientific notation style to be used when formatting numbers in NumberFormat...
ScientificNotation withExponentSignDisplay(UNumberSignDisplay exponentSignDisplay) const
Sets whether to show the sign on positive and negative exponents in scientific notation.
ScientificNotation withMinExponentDigits(int32_t minExponentDigits) const
Sets the minimum number of digits to show in the exponent of scientific notation, padding with zeros ...
Grouper(int16_t grouping1, int16_t grouping2, int16_t minGrouping, UGroupingStrategy strategy)
int16_t getSecondary() const
static Grouper forStrategy(UGroupingStrategy grouping)
static Grouper forProperties(const DecimalFormatProperties &properties)
Resolve the values in Properties to a Grouper object.
int16_t getPrimary() const
static Padder forProperties(const DecimalFormatProperties &properties)
static Padder codePoints(UChar32 cp, int32_t targetWidth, UNumberFormatPadPosition position)
SymbolsWrapper & operator=(const SymbolsWrapper &other)
SymbolsWrapper(SymbolsWrapper &&src)
bool isNumberingSystem() const
Whether the object is currently holding a NumberingSystem.
const DecimalFormatSymbols * getDecimalFormatSymbols() const
Get the DecimalFormatSymbols pointer.
SymbolsWrapper(const SymbolsWrapper &other)
void setTo(const DecimalFormatSymbols &dfs)
The provided object is copied, but we do not adopt it.
const NumberingSystem * getNumberingSystem() const
Get the NumberingSystem pointer.
void setTo(const NumberingSystem *ns)
Adopt the provided object.
UBool copyErrorTo(UErrorCode &status) const
SymbolsWrapper & operator=(SymbolsWrapper &&src)
bool isDecimalFormatSymbols() const
Whether the object is currently holding a DecimalFormatSymbols.
C++ API: Currency Unit Information.
C++ API: Symbols for formatting numbers.
C++ API: FieldPosition identifies the fields in a formatted output.
C++ API: FieldPosition Iterator.
C++ API: A unit for measuring a quantity.
U_EXPORT UBool operator==(const StringPiece &x, const StringPiece &y)
Global operator == for StringPiece.
C++ API: units for percent and permille.
C++ API: PluralRules object.
bool copyErrorTo(UErrorCode &status) const
Check all members for errors.
IntegerWidth integerWidth
C API: Encapsulates information about a currency.
UCurrencyUsage
Currency Usage used for Decimal Format.
int32_t UChar32
Define UChar32 as a type for single Unicode code points.
int8_t UBool
The ICU boolean type.
#define TRUE
The TRUE value of a UBool.
#define FALSE
The FALSE value of a UBool.
C API: Compatibility APIs for number formatting.
UNumberFormatRoundingMode
The possible number format rounding modes.
@ UNUM_ROUND_HALFEVEN
Half-even rounding.
UNumberCompactStyle
Constants for specifying short or long format.
UNumberFormatPadPosition
The possible number format pad positions.
C++ API: Common ICU base class UObject.
Basic definitions for ICU, for both C and C++ APIs.
UErrorCode
Error code to replace exception handling, so that the code is compatible with all C++ compilers,...
@ U_MEMORY_ALLOCATION_ERROR
Memory allocation error.
@ U_ZERO_ERROR
No error, no warning.
#define U_FAILURE(x)
Does the error code indicate a failure?
#define U_I18N_API
Set to export library symbols from inside the i18n library, and to import them from outside.
#define U_NAMESPACE_END
This is used to end a declaration of a public ICU C++ API.
#define U_NAMESPACE_BEGIN
This is used to begin a declaration of a public ICU C++ API.