Go to the documentation of this file.
6 #if !UCONFIG_NO_FORMATTING
7 #ifndef __NUMBERFORMATTER_H__
8 #define __NUMBERFORMATTER_H__
23 #ifndef U_HIDE_DRAFT_API
83 class FieldPositionIteratorHandler;
89 class NumberParserImpl;
90 class MultiplierParseHandler;
98 class UnlocalizedNumberFormatter;
99 class LocalizedNumberFormatter;
100 class FormattedNumber;
102 class ScientificNotation;
104 class FractionPrecision;
105 class CurrencyPrecision;
106 class IncrementPrecision;
124 static constexpr int32_t DEFAULT_THRESHOLD = 3;
130 class DecimalQuantity;
131 struct UFormattedNumberData;
132 class NumberFormatterImpl;
133 struct ParsedPatternInfo;
134 class ScientificModifier;
135 class MultiplierProducer;
137 class ScientificHandler;
139 class NumberStringBuilder;
140 class AffixPatternProvider;
141 class NumberPropertyMapper;
142 struct DecimalFormatProperties;
143 class MultiplierFormatHandler;
144 class CurrencySymbols;
145 class GeneratorHelpers;
147 class NumberRangeFormatterImpl;
326 NTN_SCIENTIFIC, NTN_COMPACT, NTN_SIMPLE, NTN_ERROR
329 union NotationUnion {
352 Notation(
const NotationType &type,
const NotationUnion &union_) : fType(type), fUnion(union_) {}
355 fUnion.errorCode = errorCode;
358 Notation() : fType(NTN_SIMPLE), fUnion() {}
361 if (fType == NTN_ERROR) {
362 status = fUnion.errorCode;
369 friend struct impl::MacroProps;
370 friend class ScientificNotation;
373 friend class impl::NumberFormatterImpl;
374 friend class impl::ScientificModifier;
375 friend class impl::ScientificHandler;
378 friend class impl::GeneratorHelpers;
423 using Notation::Notation;
432 friend class impl::NumberPropertyMapper;
629 int32_t maxSignificantDigits);
631 #ifndef U_HIDE_DEPRECATED_API
637 return fixedSignificantDigits(a);
642 return minSignificantDigits(a);
647 return maxSignificantDigits(a);
652 return minMaxSignificantDigits(a, b);
696 #ifndef U_HIDE_DEPRECATED_API
717 RND_FRACTION_SIGNIFICANT,
723 union PrecisionUnion {
755 Precision(
const PrecisionType& type,
const PrecisionUnion& union_,
757 : fType(type), fUnion(union_), fRoundingMode(roundingMode) {}
760 fUnion.errorCode = errorCode;
763 Precision() : fType(RND_BOGUS) {}
765 bool isBogus()
const {
766 return fType == RND_BOGUS;
770 if (fType == RND_ERROR) {
771 status = fUnion.errorCode;
778 Precision withCurrency(
const CurrencyUnit ¤cy,
UErrorCode &status)
const;
780 static FractionPrecision constructFraction(int32_t minFrac, int32_t maxFrac);
782 static Precision constructSignificant(int32_t minSig, int32_t maxSig);
785 constructFractionSignificant(
const FractionPrecision &base, int32_t minSig, int32_t maxSig);
787 static IncrementPrecision constructIncrement(
double increment, int32_t minFrac);
791 static Precision constructPassThrough();
794 friend struct impl::MacroProps;
795 friend struct impl::MicroProps;
798 friend class impl::NumberFormatterImpl;
801 friend class impl::NumberPropertyMapper;
804 friend class impl::RoundingImpl;
807 friend class FractionPrecision;
808 friend class CurrencyPrecision;
809 friend class IncrementPrecision;
812 friend class impl::GeneratorHelpers;
865 using Precision::Precision;
903 using Precision::Precision;
939 using Precision::Precision;
987 bool fFormatFailIfMoreThanMaxDigits;
991 bool fHasError =
false;
993 IntegerWidth(impl::digits_t minInt, impl::digits_t maxInt,
bool formatFailIfMoreThanMaxDigits);
996 fUnion.errorCode = errorCode;
1001 fUnion.minMaxInt.fMinInt = -1;
1005 static IntegerWidth standard() {
1006 return IntegerWidth::zeroFillTo(1);
1009 bool isBogus()
const {
1010 return !fHasError && fUnion.minMaxInt.fMinInt == -1;
1015 status = fUnion.errorCode;
1021 void apply(impl::DecimalQuantity &quantity,
UErrorCode &status)
const;
1023 bool operator==(
const IntegerWidth& other)
const;
1026 friend struct impl::MacroProps;
1027 friend struct impl::MicroProps;
1030 friend class impl::NumberFormatterImpl;
1033 friend class impl::NumberPropertyMapper;
1036 friend class impl::GeneratorHelpers;
1119 #ifndef U_HIDE_INTERNAL_API
1121 Scale(int32_t magnitude, impl::DecNum* arbitraryToAdopt);
1126 impl::DecNum* fArbitrary;
1129 Scale(
UErrorCode error) : fMagnitude(0), fArbitrary(nullptr), fError(error) {}
1133 bool isValid()
const {
1134 return fMagnitude != 0 || fArbitrary !=
nullptr;
1145 void applyTo(impl::DecimalQuantity& quantity)
const;
1147 void applyReciprocalTo(impl::DecimalQuantity& quantity)
const;
1150 friend struct impl::MacroProps;
1151 friend struct impl::MicroProps;
1154 friend class impl::NumberFormatterImpl;
1157 friend class impl::MultiplierFormatHandler;
1160 friend class impl::GeneratorHelpers;
1163 friend class ::icu::numparse::impl::NumberParserImpl;
1164 friend class ::icu::numparse::impl::MultiplierParseHandler;
1191 #ifndef U_HIDE_INTERNAL_API
1229 #endif // U_HIDE_INTERNAL_API
1233 if (fType == SYMPTR_DFS && fPtr.dfs ==
nullptr) {
1236 }
else if (fType == SYMPTR_NS && fPtr.ns ==
nullptr) {
1244 enum SymbolsPointerType {
1245 SYMPTR_NONE, SYMPTR_DFS, SYMPTR_NS
1253 void doCopyFrom(
const SymbolsWrapper &other);
1255 void doMoveFrom(SymbolsWrapper&& src);
1264 #ifndef U_HIDE_INTERNAL_API
1278 : fGrouping1(grouping1),
1279 fGrouping2(grouping2),
1280 fMinGrouping(minGrouping),
1281 fStrategy(strategy) {}
1282 #endif // U_HIDE_INTERNAL_API
1309 int16_t fMinGrouping;
1317 Grouper() : fGrouping1(-3) {};
1319 bool isBogus()
const {
1320 return fGrouping1 == -3;
1324 void setLocaleData(
const impl::ParsedPatternInfo &patternInfo,
const Locale& locale);
1326 bool groupAtPosition(int32_t position,
const impl::DecimalQuantity &value)
const;
1329 friend struct MacroProps;
1330 friend struct MicroProps;
1333 friend class NumberFormatterImpl;
1336 friend class ::icu::numparse::impl::NumberParserImpl;
1339 friend class impl::GeneratorHelpers;
1346 #ifndef U_HIDE_INTERNAL_API
1352 #endif // U_HIDE_INTERNAL_API
1369 Padder(int32_t width);
1372 fUnion.errorCode = errorCode;
1375 Padder() : fWidth(-2) {}
1377 bool isBogus()
const {
1378 return fWidth == -2;
1383 status = fUnion.errorCode;
1389 bool isValid()
const {
1393 int32_t padAndApply(
const impl::Modifier &mod1,
const impl::Modifier &mod2,
1394 impl::NumberStringBuilder &
string, int32_t leftIndex, int32_t rightIndex,
1398 friend struct MacroProps;
1399 friend struct MicroProps;
1402 friend class impl::NumberFormatterImpl;
1405 friend class impl::GeneratorHelpers;
1453 const AffixPatternProvider* affixProvider =
nullptr;
1459 const CurrencySymbols* currencySymbols =
nullptr;
1462 int32_t threshold = DEFAULT_THRESHOLD;
1474 return notation.copyErrorTo(status) || precision.copyErrorTo(status) ||
1475 padder.copyErrorTo(status) || integerWidth.copyErrorTo(status) ||
1476 symbols.
copyErrorTo(status) || scale.copyErrorTo(status);
1487 template<
typename Derived>
1719 #ifndef U_HIDE_DEPRECATED_API
1725 return precision(rounder);
2086 #ifndef U_HIDE_INTERNAL_API
2154 fMacros.copyErrorTo(outErrorCode);
2171 friend class impl::NumberRangeFormatterImpl;
2303 #ifndef U_HIDE_INTERNAL_API
2377 #ifndef U_HIDE_INTERNAL_API
2404 const impl::NumberFormatterImpl* fCompiled {
nullptr};
2405 char fUnsafeCallCount[8] {};
2407 explicit LocalizedNumberFormatter(
const NumberFormatterSettings<LocalizedNumberFormatter>& other);
2409 explicit LocalizedNumberFormatter(NumberFormatterSettings<LocalizedNumberFormatter>&& src)
U_NOEXCEPT;
2411 LocalizedNumberFormatter(
const impl::MacroProps ¯os,
const Locale &locale);
2413 LocalizedNumberFormatter(impl::MacroProps &¯os,
const Locale &locale);
2417 void lnfMoveHelper(LocalizedNumberFormatter&& src);
2422 bool computeCompiled(
UErrorCode& status)
const;
2425 friend class NumberFormatterSettings<UnlocalizedNumberFormatter>;
2426 friend class NumberFormatterSettings<LocalizedNumberFormatter>;
2429 friend class UnlocalizedNumberFormatter;
2440 #ifndef U_HIDE_DEPRECATED_API
2462 #ifndef U_HIDE_DEPRECATED_API
2490 #ifndef U_HIDE_DEPRECATED_API
2547 #ifndef U_HIDE_DEPRECATED_API
2581 #ifndef U_HIDE_INTERNAL_API
2629 const impl::UFormattedNumberData *fResults;
2642 : fResults(nullptr), fErrorCode(errorCode) {};
2645 friend class LocalizedNumberFormatter;
2697 #endif // U_HIDE_DRAFT_API
2699 #endif // __NUMBERFORMATTER_H__
A class that defines a quantity by which a number should be multiplied when formatting.
ScientificNotation withMinExponentDigits(int32_t minExponentDigits) const
Sets the minimum number of digits to show in the exponent of scientific notation, padding with zeros ...
int8_t fEngineeringInterval
#define FALSE
The FALSE value of a UBool.
A unit such as length, mass, volume, currency, etc.
static ScientificNotation engineering()
Print the number using engineering notation, a variant of scientific notation in which the exponent m...
FieldPosition is a simple class used by Format and its subclasses to identify fields in formatted out...
C++ API: FieldPosition Iterator.
static Scale byDoubleAndPowerOfTen(double multiplicand, int32_t power)
Multiply a number by both a power of ten and by an arbitrary double value.
Precision withMinDigits(int32_t minSignificantDigits) const
Ensure that no less than this number of significant digits are retained when rounding according to fr...
static SignificantDigitsPrecision minDigits(int32_t a)
Basic definitions for ICU, for both C and C++ APIs.
A unit of currency, such as USD (U.S.
A class that defines the strategy for padding and truncating integers before the decimal separator.
#define U_I18N_API
Set to export library symbols from inside the i18n library, and to import them from outside.
static IntegerWidth zeroFillTo(int32_t minInt)
Pad numbers at the beginning with zeros to guarantee a certain number of numerals before the decimal ...
int8_t UBool
The ICU boolean type.
FieldPositionIterator returns the field ids and their start/limit positions generated by a call to Fo...
A class that defines a rounding precision parameterized by a rounding increment to be used when forma...
void setTo(const NumberingSystem *ns)
Adopt the provided object.
U_EXPORT UBool operator==(const StringPiece &x, const StringPiece &y)
Global operator == for StringPiece.
Defines rules for mapping non-negative numeric values onto a small set of keywords.
static Grouper forStrategy(UNumberGroupingStrategy grouping)
static Grouper forProperties(const DecimalFormatProperties &properties)
Resolve the values in Properties to a Grouper object.
UCurrencyUsage
Currency Usage used for Decimal Format.
static Scale byDecimal(StringPiece multiplicand)
Multiply numbers by an arbitrary value before formatting.
static SimpleNotation simple()
Print the number using simple notation without any scaling by powers of ten.
Scale & operator=(Scale &&src) U_NOEXCEPT
static CurrencyPrecision currency(UCurrencyUsage currencyUsage)
Show numbers rounded and padded according to the rules for the currency unit.
Scale & operator=(const Scale &other)
Precision withMinFraction(int32_t minFrac) const
Specifies the minimum number of fraction digits to render after the decimal separator,...
static FractionPrecision maxFraction(int32_t maxFractionPlaces)
Show numbers rounded if necessary to a certain number of fraction places (numerals after the decimal ...
bool isNumberingSystem() const
Whether the object is currently holding a NumberingSystem.
@ U_MEMORY_ALLOCATION_ERROR
Memory allocation error.
static SignificantDigitsPrecision minSignificantDigits(int32_t minSignificantDigits)
Always show at least a certain number of significant digits/figures, padding with zeros if necessary.
static CompactNotation compactShort()
Print the number using short-form compact notation.
SymbolsWrapper(SymbolsWrapper &&src) U_NOEXCEPT
C++ API: FieldPosition identifies the fields in a formatted output.
C API: Compatibility APIs for number formatting.
UnicodeString is a string class that stores Unicode characters directly and provides similar function...
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 ...
SymbolsWrapper(const SymbolsWrapper &other)
int32_t UChar32
Define UChar32 as a type for single Unicode code points.
impl::digits_t fMinExponentDigits
#define U_FAILURE(x)
Does the error code indicate a failure?
static SignificantDigitsPrecision maxDigits(int32_t a)
static SignificantDigitsPrecision fixedSignificantDigits(int32_t minMaxSignificantDigits)
Show numbers rounded if necessary to a certain number of significant digits or significant figures.
UErrorCode
Error code to replace exception handling, so that the code is compatible with all C++ compilers,...
SymbolsWrapper & operator=(SymbolsWrapper &&src) U_NOEXCEPT
static FractionPrecision minFraction(int32_t minFractionPlaces)
Always show at least a certain number of fraction places after the decimal separator,...
#define TRUE
The TRUE value of a UBool.
UNumberSignDisplay fExponentSignDisplay
static SignificantDigitsPrecision maxSignificantDigits(int32_t maxSignificantDigits)
Show numbers rounded if necessary to a certain number of significant digits/figures.
IntegerWidth integerWidth
A class that defines the rounding precision to be used when formatting numbers in NumberFormatter.
UMemory is the common ICU base class.
static Scale powerOfTen(int32_t power)
Multiply numbers by a power of ten before formatting.
bool isDecimalFormatSymbols() const
Whether the object is currently holding a DecimalFormatSymbols.
C++ API: Symbols for formatting numbers.
static Padder codePoints(UChar32 cp, int32_t targetWidth, UNumberFormatPadPosition position)
ScientificNotation withExponentSignDisplay(UNumberSignDisplay exponentSignDisplay) const
Sets whether to show the sign on positive and negative exponents in scientific notation.
@ U_ZERO_ERROR
No error, no warning.
C++ API: Appendable class: Sink for Unicode code points and 16-bit code units (char16_ts).
int16_t getPrimary() const
void setTo(const DecimalFormatSymbols &dfs)
The provided object is copied, but we do not adopt it.
int16_t getSecondary() const
static Padder forProperties(const DecimalFormatProperties &properties)
A class that defines a rounding precision based on a number of fraction places and optionally signifi...
C API: Encapsulates information about a currency.
A class that defines a rounding precision parameterized by a currency to be used when formatting numb...
@ UNUM_ROUND_HALFEVEN
Half-even rounding.
Base class for objects to which Unicode characters and strings can be appended.
static Scale byDouble(double multiplicand)
Multiply numbers by an arbitrary value before formatting.
SymbolsWrapper & operator=(const SymbolsWrapper &other)
Grouper(int16_t grouping1, int16_t grouping2, int16_t minGrouping, UNumberGroupingStrategy strategy)
Defines numbering systems.
UBool copyErrorTo(UErrorCode &status) const
static ScientificNotation scientific()
Print the number using scientific notation (also known as scientific form, standard index form,...
static SignificantDigitsPrecision fixedDigits(int32_t a)
static Scale none()
Do not change the value of numbers when formatting or parsing.
A class that defines the notation style to be used when formatting numbers in NumberFormatter.
A class that defines the scientific notation style to be used when formatting numbers in NumberFormat...
UNumberFormatRoundingMode
The possible number format rounding modes.
static CompactNotation compactLong()
Print the number using long-form compact notation.
Precision withMode(UNumberFormatRoundingMode roundingMode) const
Sets the rounding mode to use when picking the direction to round (up or down).
Precision withCurrency(const CurrencyUnit ¤cy) const
Associates a currency with this rounding precision.
static Precision unlimited()
Show all available digits to full precision.
static FractionPrecision integer()
Show numbers rounded if necessary to the nearest integer.
Precision withMaxDigits(int32_t maxSignificantDigits) const
Ensure that no more than this number of significant digits are retained when rounding according to fr...
static SignificantDigitsPrecision minMaxSignificantDigits(int32_t minSignificantDigits, int32_t maxSignificantDigits)
Show numbers rounded if necessary to a certain number of significant digits/figures; in addition,...
C++ API: Common ICU base class UObject.
C++ API: units for percent and permille.
C++ API: PluralRules object.
const DecimalFormatSymbols * getDecimalFormatSymbols() const
Get the DecimalFormatSymbols pointer.
static SignificantDigitsPrecision minMaxDigits(int32_t a, int32_t b)
#define U_NAMESPACE_END
This is used to end a declaration of a public ICU C++ API.
C++ API: A unit for measuring a quantity.
UNumberFormatPadPosition
The possible number format pad positions.
#define U_NAMESPACE_BEGIN
This is used to begin a declaration of a public ICU C++ API.
A string-like object that points to a sized piece of memory.
C++ API: Currency Unit Information.
Scale(int32_t magnitude, impl::DecNum *arbitraryToAdopt)
IntegerWidth truncateAt(int32_t maxInt)
Truncate numbers exceeding a certain number of numerals before the decimal separator.
static FractionPrecision fixedFraction(int32_t minMaxFractionPlaces)
Show numbers rounded if necessary to a certain number of fraction places (numerals after the decimal ...
Scale(const Scale &other)
A Locale object represents a specific geographical, political, or cultural region.
const NumberingSystem * getNumberingSystem() const
Get the NumberingSystem pointer.
static IncrementPrecision increment(double roundingIncrement)
Show numbers rounded if necessary to the closest multiple of a certain rounding increment.
Scale(Scale &&src) U_NOEXCEPT
bool copyErrorTo(UErrorCode &status) const
Check all members for errors.
UNumberCompactStyle
Constants for specifying short or long format.