Go to the documentation of this file.
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;
105 class UnlocalizedNumberFormatter;
106 class LocalizedNumberFormatter;
107 class FormattedNumber;
109 class ScientificNotation;
111 class FractionPrecision;
112 class CurrencyPrecision;
113 class IncrementPrecision;
133 static constexpr int32_t kInternalDefaultThreshold = 3;
139 class DecimalQuantity;
140 class UFormattedNumberData;
141 class NumberFormatterImpl;
142 struct ParsedPatternInfo;
143 class ScientificModifier;
144 class MultiplierProducer;
146 class ScientificHandler;
148 class AffixPatternProvider;
149 class NumberPropertyMapper;
150 struct DecimalFormatProperties;
151 class MultiplierFormatHandler;
152 class CurrencySymbols;
153 class GeneratorHelpers;
155 class NumberRangeFormatterImpl;
157 struct UFormattedNumberImpl;
335 NTN_SCIENTIFIC, NTN_COMPACT, NTN_SIMPLE, NTN_ERROR
338 union NotationUnion {
361 Notation(
const NotationType &type,
const NotationUnion &union_) : fType(type), fUnion(union_) {}
364 fUnion.errorCode = errorCode;
367 Notation() : fType(NTN_SIMPLE), fUnion() {}
370 if (fType == NTN_ERROR) {
371 status = fUnion.errorCode;
378 friend struct impl::MacroProps;
379 friend class ScientificNotation;
382 friend class impl::NumberFormatterImpl;
383 friend class impl::ScientificModifier;
384 friend class impl::ScientificHandler;
387 friend class impl::GeneratorHelpers;
432 using Notation::Notation;
441 friend class impl::NumberPropertyMapper;
611 int32_t maxSignificantDigits);
659 RND_FRACTION_SIGNIFICANT,
676 union PrecisionUnion {
709 Precision(
const PrecisionType& type,
const PrecisionUnion& union_,
711 : fType(type), fUnion(union_), fRoundingMode(roundingMode) {}
714 fUnion.errorCode = errorCode;
717 Precision() : fType(RND_BOGUS) {}
719 bool isBogus()
const {
720 return fType == RND_BOGUS;
724 if (fType == RND_ERROR) {
725 status = fUnion.errorCode;
732 Precision withCurrency(
const CurrencyUnit ¤cy,
UErrorCode &status)
const;
734 static FractionPrecision constructFraction(int32_t minFrac, int32_t maxFrac);
736 static Precision constructSignificant(int32_t minSig, int32_t maxSig);
739 constructFractionSignificant(
const FractionPrecision &base, int32_t minSig, int32_t maxSig);
741 static IncrementPrecision constructIncrement(
double increment, int32_t minFrac);
745 static Precision constructPassThrough();
748 friend struct impl::MacroProps;
749 friend struct impl::MicroProps;
752 friend class impl::NumberFormatterImpl;
755 friend class impl::NumberPropertyMapper;
758 friend class impl::RoundingImpl;
761 friend class FractionPrecision;
762 friend class CurrencyPrecision;
763 friend class IncrementPrecision;
766 friend class impl::GeneratorHelpers;
819 using Precision::Precision;
857 using Precision::Precision;
893 using Precision::Precision;
941 bool fFormatFailIfMoreThanMaxDigits;
945 bool fHasError =
false;
947 IntegerWidth(impl::digits_t minInt, impl::digits_t maxInt,
bool formatFailIfMoreThanMaxDigits);
950 fUnion.errorCode = errorCode;
955 fUnion.minMaxInt.fMinInt = -1;
959 static IntegerWidth standard() {
960 return IntegerWidth::zeroFillTo(1);
963 bool isBogus()
const {
964 return !fHasError && fUnion.minMaxInt.fMinInt == -1;
969 status = fUnion.errorCode;
975 void apply(impl::DecimalQuantity &quantity,
UErrorCode &status)
const;
977 bool operator==(
const IntegerWidth& other)
const;
980 friend struct impl::MacroProps;
981 friend struct impl::MicroProps;
984 friend class impl::NumberFormatterImpl;
987 friend class impl::NumberPropertyMapper;
990 friend class impl::GeneratorHelpers;
1073 #ifndef U_HIDE_INTERNAL_API
1075 Scale(int32_t magnitude, impl::DecNum* arbitraryToAdopt);
1080 impl::DecNum* fArbitrary;
1083 Scale(
UErrorCode error) : fMagnitude(0), fArbitrary(nullptr), fError(error) {}
1087 bool isValid()
const {
1088 return fMagnitude != 0 || fArbitrary !=
nullptr;
1099 void applyTo(impl::DecimalQuantity& quantity)
const;
1101 void applyReciprocalTo(impl::DecimalQuantity& quantity)
const;
1104 friend struct impl::MacroProps;
1105 friend struct impl::MicroProps;
1108 friend class impl::NumberFormatterImpl;
1111 friend class impl::MultiplierFormatHandler;
1114 friend class impl::GeneratorHelpers;
1117 friend class ::icu::numparse::impl::NumberParserImpl;
1118 friend class ::icu::numparse::impl::MultiplierParseHandler;
1145 #ifndef U_HIDE_INTERNAL_API
1183 #endif // U_HIDE_INTERNAL_API
1187 if (fType == SYMPTR_DFS && fPtr.dfs ==
nullptr) {
1190 }
else if (fType == SYMPTR_NS && fPtr.ns ==
nullptr) {
1198 enum SymbolsPointerType {
1199 SYMPTR_NONE, SYMPTR_DFS, SYMPTR_NS
1207 void doCopyFrom(
const SymbolsWrapper &other);
1209 void doMoveFrom(SymbolsWrapper&& src);
1218 #ifndef U_HIDE_INTERNAL_API
1232 : fGrouping1(grouping1),
1233 fGrouping2(grouping2),
1234 fMinGrouping(minGrouping),
1235 fStrategy(strategy) {}
1236 #endif // U_HIDE_INTERNAL_API
1263 int16_t fMinGrouping;
1273 bool isBogus()
const {
1274 return fGrouping1 == -3;
1278 void setLocaleData(
const impl::ParsedPatternInfo &patternInfo,
const Locale& locale);
1280 bool groupAtPosition(int32_t position,
const impl::DecimalQuantity &value)
const;
1283 friend struct MacroProps;
1284 friend struct MicroProps;
1287 friend class NumberFormatterImpl;
1290 friend class ::icu::numparse::impl::NumberParserImpl;
1293 friend class impl::GeneratorHelpers;
1300 #ifndef U_HIDE_INTERNAL_API
1306 #endif // U_HIDE_INTERNAL_API
1323 Padder(int32_t width);
1326 fUnion.errorCode = errorCode;
1329 Padder() : fWidth(-2) {}
1331 bool isBogus()
const {
1332 return fWidth == -2;
1337 status = fUnion.errorCode;
1343 bool isValid()
const {
1347 int32_t padAndApply(
const impl::Modifier &mod1,
const impl::Modifier &mod2,
1348 FormattedStringBuilder &
string, int32_t leftIndex, int32_t rightIndex,
1352 friend struct MacroProps;
1353 friend struct MicroProps;
1356 friend class impl::NumberFormatterImpl;
1359 friend class impl::GeneratorHelpers;
1407 const AffixPatternProvider* affixProvider =
nullptr;
1413 const CurrencySymbols* currencySymbols =
nullptr;
1416 int32_t threshold = kInternalDefaultThreshold;
1428 return notation.copyErrorTo(status) || precision.copyErrorTo(status) ||
1429 padder.copyErrorTo(status) || integerWidth.copyErrorTo(status) ||
1430 symbols.
copyErrorTo(status) || scale.copyErrorTo(status);
1441 template<
typename Derived>
2028 #ifndef U_HIDE_INTERNAL_API
2085 #ifndef U_HIDE_DRAFT_API
2120 fMacros.copyErrorTo(outErrorCode);
2137 friend class impl::NumberRangeFormatterImpl;
2273 #ifndef U_HIDE_INTERNAL_API
2347 #ifndef U_HIDE_INTERNAL_API
2374 const impl::NumberFormatterImpl* fCompiled {
nullptr};
2375 char fUnsafeCallCount[8] {};
2377 explicit LocalizedNumberFormatter(
const NumberFormatterSettings<LocalizedNumberFormatter>& other);
2379 explicit LocalizedNumberFormatter(NumberFormatterSettings<LocalizedNumberFormatter>&& src)
U_NOEXCEPT;
2381 LocalizedNumberFormatter(
const impl::MacroProps ¯os,
const Locale &locale);
2383 LocalizedNumberFormatter(impl::MacroProps &¯os,
const Locale &locale);
2387 void lnfMoveHelper(LocalizedNumberFormatter&& src);
2392 bool computeCompiled(
UErrorCode& status)
const;
2395 friend class NumberFormatterSettings<UnlocalizedNumberFormatter>;
2396 friend class NumberFormatterSettings<LocalizedNumberFormatter>;
2399 friend class UnlocalizedNumberFormatter;
2414 #ifndef U_FORCE_HIDE_DRAFT_API
2421 #endif // U_FORCE_HIDE_DRAFT_API
2475 #ifndef U_HIDE_DRAFT_API
2529 #ifndef U_HIDE_DRAFT_API
2548 template<
typename StringClass>
2549 inline StringClass toDecimalNumber(
UErrorCode& status)
const;
2550 #endif // U_HIDE_DRAFT_API
2552 #ifndef U_HIDE_INTERNAL_API
2570 const impl::UFormattedNumberData *fData;
2583 : fData(nullptr), fErrorCode(errorCode) {}
2589 friend class LocalizedNumberFormatter;
2592 friend struct impl::UFormattedNumberImpl;
2595 #ifndef U_HIDE_DRAFT_API
2597 template<
typename StringClass>
2598 StringClass FormattedNumber::toDecimalNumber(
UErrorCode& status)
const {
2601 toDecimalNumber(sink, status);
2604 #endif // U_HIDE_DRAFT_API
2649 #ifndef U_HIDE_DRAFT_API
2684 #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.
C API: Parse Error Information.
Precision withMinDigits(int32_t minSignificantDigits) const
Ensure that no less than this number of significant digits are retained when rounding according to fr...
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.
#define U_OVERRIDE
Defined to the C++11 "override" keyword if available.
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.
"Smart pointer" class, deletes objects via the standard C++ delete operator.
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.
A UParseError struct is used to returned detailed information about parsing errors.
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 fixedSignificantDigits(int32_t minMaxSignificantDigits)
Show numbers rounded if necessary to a certain number of significant digits or significant figures.
UErrorCode
Standard ICU4C error code type, a substitute for exceptions.
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.
A ByteSink can be filled with bytes.
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 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.
Implementation of ByteSink that writes to a "string".
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.
@ U_INVALID_STATE_ERROR
Requested operation can not be completed with ICU in its current state.
const DecimalFormatSymbols * getDecimalFormatSymbols() const
Get the DecimalFormatSymbols pointer.
C++ API: A unit for measuring a quantity.
UNumberFormatPadPosition
The possible number format pad positions.
A string-like object that points to a sized piece of memory.
C++ API: Interface for writing bytes, and implementation classes.
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.
Represents a span of a string containing a given field.
UNumberCompactStyle
Constants for specifying short or long format.