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;
158 class MutablePatternModifier;
159 class ImmutablePatternModifier;
337 NTN_SCIENTIFIC, NTN_COMPACT, NTN_SIMPLE, NTN_ERROR
340 union NotationUnion {
363 Notation(
const NotationType &type,
const NotationUnion &union_) : fType(type), fUnion(union_) {}
366 fUnion.errorCode = errorCode;
369 Notation() : fType(NTN_SIMPLE), fUnion() {}
372 if (fType == NTN_ERROR) {
373 status = fUnion.errorCode;
380 friend struct impl::MacroProps;
381 friend class ScientificNotation;
384 friend class impl::NumberFormatterImpl;
385 friend class impl::ScientificModifier;
386 friend class impl::ScientificHandler;
389 friend class impl::GeneratorHelpers;
434 using Notation::Notation;
443 friend class impl::NumberPropertyMapper;
613 int32_t maxSignificantDigits);
661 RND_FRACTION_SIGNIFICANT,
678 union PrecisionUnion {
711 Precision(
const PrecisionType& type,
const PrecisionUnion& union_,
713 : fType(type), fUnion(union_), fRoundingMode(roundingMode) {}
716 fUnion.errorCode = errorCode;
719 Precision() : fType(RND_BOGUS) {}
721 bool isBogus()
const {
722 return fType == RND_BOGUS;
726 if (fType == RND_ERROR) {
727 status = fUnion.errorCode;
734 Precision withCurrency(
const CurrencyUnit ¤cy,
UErrorCode &status)
const;
736 static FractionPrecision constructFraction(int32_t minFrac, int32_t maxFrac);
738 static Precision constructSignificant(int32_t minSig, int32_t maxSig);
741 constructFractionSignificant(
const FractionPrecision &base, int32_t minSig, int32_t maxSig);
743 static IncrementPrecision constructIncrement(
double increment, int32_t minFrac);
747 static Precision constructPassThrough();
750 friend struct impl::MacroProps;
751 friend struct impl::MicroProps;
754 friend class impl::NumberFormatterImpl;
757 friend class impl::NumberPropertyMapper;
760 friend class impl::RoundingImpl;
763 friend class FractionPrecision;
764 friend class CurrencyPrecision;
765 friend class IncrementPrecision;
768 friend class impl::GeneratorHelpers;
821 using Precision::Precision;
859 using Precision::Precision;
895 using Precision::Precision;
943 bool fFormatFailIfMoreThanMaxDigits;
947 bool fHasError =
false;
949 IntegerWidth(impl::digits_t minInt, impl::digits_t maxInt,
bool formatFailIfMoreThanMaxDigits);
952 fUnion.errorCode = errorCode;
957 fUnion.minMaxInt.fMinInt = -1;
961 static IntegerWidth standard() {
962 return IntegerWidth::zeroFillTo(1);
965 bool isBogus()
const {
966 return !fHasError && fUnion.minMaxInt.fMinInt == -1;
971 status = fUnion.errorCode;
977 void apply(impl::DecimalQuantity &quantity,
UErrorCode &status)
const;
979 bool operator==(
const IntegerWidth& other)
const;
982 friend struct impl::MacroProps;
983 friend struct impl::MicroProps;
986 friend class impl::NumberFormatterImpl;
989 friend class impl::MutablePatternModifier;
990 friend class impl::ImmutablePatternModifier;
993 friend class impl::NumberPropertyMapper;
996 friend class impl::GeneratorHelpers;
1079 #ifndef U_HIDE_INTERNAL_API
1081 Scale(int32_t magnitude, impl::DecNum* arbitraryToAdopt);
1086 impl::DecNum* fArbitrary;
1089 Scale(
UErrorCode error) : fMagnitude(0), fArbitrary(nullptr), fError(error) {}
1093 bool isValid()
const {
1094 return fMagnitude != 0 || fArbitrary !=
nullptr;
1105 void applyTo(impl::DecimalQuantity& quantity)
const;
1107 void applyReciprocalTo(impl::DecimalQuantity& quantity)
const;
1110 friend struct impl::MacroProps;
1111 friend struct impl::MicroProps;
1114 friend class impl::NumberFormatterImpl;
1117 friend class impl::MultiplierFormatHandler;
1120 friend class impl::GeneratorHelpers;
1123 friend class ::icu::numparse::impl::NumberParserImpl;
1124 friend class ::icu::numparse::impl::MultiplierParseHandler;
1151 #ifndef U_HIDE_INTERNAL_API
1193 if (fType == SYMPTR_DFS && fPtr.dfs ==
nullptr) {
1196 }
else if (fType == SYMPTR_NS && fPtr.ns ==
nullptr) {
1204 enum SymbolsPointerType {
1205 SYMPTR_NONE, SYMPTR_DFS, SYMPTR_NS
1213 void doCopyFrom(
const SymbolsWrapper &other);
1215 void doMoveFrom(SymbolsWrapper&& src);
1224 #ifndef U_HIDE_INTERNAL_API
1238 : fGrouping1(grouping1),
1239 fGrouping2(grouping2),
1240 fMinGrouping(minGrouping),
1241 fStrategy(strategy) {}
1269 int16_t fMinGrouping;
1279 bool isBogus()
const {
1280 return fGrouping1 == -3;
1284 void setLocaleData(
const impl::ParsedPatternInfo &patternInfo,
const Locale& locale);
1286 bool groupAtPosition(int32_t position,
const impl::DecimalQuantity &value)
const;
1289 friend struct MacroProps;
1290 friend struct MicroProps;
1293 friend class NumberFormatterImpl;
1296 friend class ::icu::numparse::impl::NumberParserImpl;
1299 friend class impl::GeneratorHelpers;
1306 #ifndef U_HIDE_INTERNAL_API
1329 Padder(int32_t width);
1332 fUnion.errorCode = errorCode;
1335 Padder() : fWidth(-2) {}
1337 bool isBogus()
const {
1338 return fWidth == -2;
1343 status = fUnion.errorCode;
1349 bool isValid()
const {
1353 int32_t padAndApply(
const impl::Modifier &mod1,
const impl::Modifier &mod2,
1354 FormattedStringBuilder &
string, int32_t leftIndex, int32_t rightIndex,
1358 friend struct MacroProps;
1359 friend struct MicroProps;
1362 friend class impl::NumberFormatterImpl;
1365 friend class impl::GeneratorHelpers;
1413 const AffixPatternProvider* affixProvider =
nullptr;
1419 int32_t threshold = kInternalDefaultThreshold;
1431 return notation.copyErrorTo(status) || precision.copyErrorTo(status) ||
1432 padder.copyErrorTo(status) || integerWidth.copyErrorTo(status) ||
1433 symbols.
copyErrorTo(status) || scale.copyErrorTo(status);
1439 #if (U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN) && defined(_MSC_VER)
1445 #pragma warning(push)
1446 #pragma warning(disable: 4661)
1454 template<
typename Derived>
2041 #ifndef U_HIDE_INTERNAL_API
2131 fMacros.copyErrorTo(outErrorCode);
2148 friend class impl::NumberRangeFormatterImpl;
2284 #ifndef U_HIDE_INTERNAL_API
2358 #ifndef U_HIDE_INTERNAL_API
2385 const impl::NumberFormatterImpl* fCompiled {
nullptr};
2386 char fUnsafeCallCount[8] {};
2388 explicit LocalizedNumberFormatter(
const NumberFormatterSettings<LocalizedNumberFormatter>& other);
2390 explicit LocalizedNumberFormatter(NumberFormatterSettings<LocalizedNumberFormatter>&& src)
U_NOEXCEPT;
2392 LocalizedNumberFormatter(
const impl::MacroProps ¯os,
const Locale &locale);
2394 LocalizedNumberFormatter(impl::MacroProps &¯os,
const Locale &locale);
2398 void lnfMoveHelper(LocalizedNumberFormatter&& src);
2403 bool computeCompiled(
UErrorCode& status)
const;
2406 friend class NumberFormatterSettings<UnlocalizedNumberFormatter>;
2407 friend class NumberFormatterSettings<LocalizedNumberFormatter>;
2410 friend class UnlocalizedNumberFormatter;
2413 #if (U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN) && defined(_MSC_VER)
2415 #pragma warning(pop)
2488 #ifndef U_HIDE_DRAFT_API
2507 template<
typename StringClass>
2508 inline StringClass toDecimalNumber(
UErrorCode& status)
const;
2511 #ifndef U_HIDE_INTERNAL_API
2529 const impl::UFormattedNumberData *fData;
2542 : fData(nullptr), fErrorCode(errorCode) {}
2548 friend class LocalizedNumberFormatter;
2551 friend struct impl::UFormattedNumberImpl;
2554 #ifndef U_HIDE_DRAFT_API
2556 template<
typename StringClass>
2557 StringClass FormattedNumber::toDecimalNumber(
UErrorCode& status)
const {
2560 toDecimalNumber(sink, status);
C++ API: Appendable class: Sink for Unicode code points and 16-bit code units (char16_ts).
C++ API: Interface for writing bytes, and implementation classes.
Base class for objects to which Unicode characters and strings can be appended.
A ByteSink can be filled with bytes.
Represents a span of a string containing a given field.
A unit of currency, such as USD (U.S.
"Smart pointer" class, deletes objects via the standard C++ delete operator.
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.
Implementation of ByteSink that writes to a "string".
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.
static FractionPrecision maxFraction(int32_t maxFractionPlaces)
Show numbers rounded if necessary to a certain number of fraction places (numerals after the decimal ...
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 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 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.
Scale(Scale &&src) U_NOEXCEPT
Scale & operator=(const Scale &other)
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=(Scale &&src) U_NOEXCEPT
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 ...
static Grouper forStrategy(UNumberGroupingStrategy grouping)
Grouper(int16_t grouping1, int16_t grouping2, int16_t minGrouping, UNumberGroupingStrategy strategy)
int16_t getSecondary() const
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=(SymbolsWrapper &&src) U_NOEXCEPT
SymbolsWrapper & operator=(const SymbolsWrapper &other)
const NumberingSystem * getNumberingSystem() const
Get the NumberingSystem pointer.
bool isNumberingSystem() const
Whether the object is currently holding a NumberingSystem.
const DecimalFormatSymbols * getDecimalFormatSymbols() const
Get the DecimalFormatSymbols pointer.
SymbolsWrapper(SymbolsWrapper &&src) U_NOEXCEPT
SymbolsWrapper(const SymbolsWrapper &other)
void setTo(const DecimalFormatSymbols &dfs)
The provided object is copied, but we do not adopt it.
void setTo(const NumberingSystem *ns)
Adopt the provided object.
UBool copyErrorTo(UErrorCode &status) const
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: Parse Error Information.
C++ API: PluralRules object.
A UParseError struct is used to returned detailed information about parsing errors.
impl::digits_t fMinExponentDigits
UNumberSignDisplay fExponentSignDisplay
int8_t fEngineeringInterval
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 U_OVERRIDE
Defined to the C++11 "override" keyword if available.
#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
Standard ICU4C error code type, a substitute for exceptions.
@ U_MEMORY_ALLOCATION_ERROR
Memory allocation error.
@ U_INVALID_STATE_ERROR
Requested operation can not be completed with ICU in its current state.
@ 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.