00001
00002
00003
00004 #ifndef __NUMBERFORMATTER_H__
00005 #define __NUMBERFORMATTER_H__
00006
00007 #include "unicode/utypes.h"
00008
00009 #if U_SHOW_CPLUSPLUS_API
00010
00011 #if !UCONFIG_NO_FORMATTING
00012
00013 #include "unicode/appendable.h"
00014 #include "unicode/bytestream.h"
00015 #include "unicode/currunit.h"
00016 #include "unicode/dcfmtsym.h"
00017 #include "unicode/fieldpos.h"
00018 #include "unicode/formattedvalue.h"
00019 #include "unicode/fpositer.h"
00020 #include "unicode/measunit.h"
00021 #include "unicode/nounit.h"
00022 #include "unicode/parseerr.h"
00023 #include "unicode/plurrule.h"
00024 #include "unicode/ucurr.h"
00025 #include "unicode/unum.h"
00026 #include "unicode/unumberformatter.h"
00027 #include "unicode/uobject.h"
00028
00085 U_NAMESPACE_BEGIN
00086
00087
00088 class IFixedDecimal;
00089 class FieldPositionIteratorHandler;
00090 class FormattedStringBuilder;
00091
00092 namespace numparse {
00093 namespace impl {
00094
00095
00096 class NumberParserImpl;
00097 class MultiplierParseHandler;
00098
00099 }
00100 }
00101
00102 namespace number {
00103
00104
00105 class UnlocalizedNumberFormatter;
00106 class LocalizedNumberFormatter;
00107 class FormattedNumber;
00108 class Notation;
00109 class ScientificNotation;
00110 class Precision;
00111 class FractionPrecision;
00112 class CurrencyPrecision;
00113 class IncrementPrecision;
00114 class IntegerWidth;
00115
00116 namespace impl {
00117
00118
00124 typedef int16_t digits_t;
00125
00126
00133 static constexpr int32_t kInternalDefaultThreshold = 3;
00134
00135
00136 class Padder;
00137 struct MacroProps;
00138 struct MicroProps;
00139 class DecimalQuantity;
00140 class UFormattedNumberData;
00141 class NumberFormatterImpl;
00142 struct ParsedPatternInfo;
00143 class ScientificModifier;
00144 class MultiplierProducer;
00145 class RoundingImpl;
00146 class ScientificHandler;
00147 class Modifier;
00148 class AffixPatternProvider;
00149 class NumberPropertyMapper;
00150 struct DecimalFormatProperties;
00151 class MultiplierFormatHandler;
00152 class CurrencySymbols;
00153 class GeneratorHelpers;
00154 class DecNum;
00155 class NumberRangeFormatterImpl;
00156 struct RangeMacroProps;
00157 struct UFormattedNumberImpl;
00158
00165 void touchRangeLocales(impl::RangeMacroProps& macros);
00166
00167 }
00168
00174 typedef Notation CompactNotation;
00175
00181 typedef Notation SimpleNotation;
00182
00188 class U_I18N_API Notation : public UMemory {
00189 public:
00214 static ScientificNotation scientific();
00215
00238 static ScientificNotation engineering();
00239
00281 static CompactNotation compactShort();
00282
00305 static CompactNotation compactLong();
00306
00331 static SimpleNotation simple();
00332
00333 private:
00334 enum NotationType {
00335 NTN_SCIENTIFIC, NTN_COMPACT, NTN_SIMPLE, NTN_ERROR
00336 } fType;
00337
00338 union NotationUnion {
00339
00341 struct ScientificSettings {
00343 int8_t fEngineeringInterval;
00345 bool fRequireMinInt;
00347 impl::digits_t fMinExponentDigits;
00349 UNumberSignDisplay fExponentSignDisplay;
00350 } scientific;
00351
00352
00353 UNumberCompactStyle compactStyle;
00354
00355
00356 UErrorCode errorCode;
00357 } fUnion;
00358
00359 typedef NotationUnion::ScientificSettings ScientificSettings;
00360
00361 Notation(const NotationType &type, const NotationUnion &union_) : fType(type), fUnion(union_) {}
00362
00363 Notation(UErrorCode errorCode) : fType(NTN_ERROR) {
00364 fUnion.errorCode = errorCode;
00365 }
00366
00367 Notation() : fType(NTN_SIMPLE), fUnion() {}
00368
00369 UBool copyErrorTo(UErrorCode &status) const {
00370 if (fType == NTN_ERROR) {
00371 status = fUnion.errorCode;
00372 return TRUE;
00373 }
00374 return FALSE;
00375 }
00376
00377
00378 friend struct impl::MacroProps;
00379 friend class ScientificNotation;
00380
00381
00382 friend class impl::NumberFormatterImpl;
00383 friend class impl::ScientificModifier;
00384 friend class impl::ScientificHandler;
00385
00386
00387 friend class impl::GeneratorHelpers;
00388 };
00389
00398 class U_I18N_API ScientificNotation : public Notation {
00399 public:
00413 ScientificNotation withMinExponentDigits(int32_t minExponentDigits) const;
00414
00428 ScientificNotation withExponentSignDisplay(UNumberSignDisplay exponentSignDisplay) const;
00429
00430 private:
00431
00432 using Notation::Notation;
00433
00434
00435 ScientificNotation(int8_t fEngineeringInterval, bool fRequireMinInt, impl::digits_t fMinExponentDigits,
00436 UNumberSignDisplay fExponentSignDisplay);
00437
00438 friend class Notation;
00439
00440
00441 friend class impl::NumberPropertyMapper;
00442 };
00443
00449 typedef Precision SignificantDigitsPrecision;
00450
00459 class U_I18N_API Precision : public UMemory {
00460
00461 public:
00479 static Precision unlimited();
00480
00487 static FractionPrecision integer();
00488
00516 static FractionPrecision fixedFraction(int32_t minMaxFractionPlaces);
00517
00531 static FractionPrecision minFraction(int32_t minFractionPlaces);
00532
00543 static FractionPrecision maxFraction(int32_t maxFractionPlaces);
00544
00558 static FractionPrecision minMaxFraction(int32_t minFractionPlaces, int32_t maxFractionPlaces);
00559
00573 static SignificantDigitsPrecision fixedSignificantDigits(int32_t minMaxSignificantDigits);
00574
00587 static SignificantDigitsPrecision minSignificantDigits(int32_t minSignificantDigits);
00588
00597 static SignificantDigitsPrecision maxSignificantDigits(int32_t maxSignificantDigits);
00598
00610 static SignificantDigitsPrecision minMaxSignificantDigits(int32_t minSignificantDigits,
00611 int32_t maxSignificantDigits);
00612
00632 static IncrementPrecision increment(double roundingIncrement);
00633
00651 static CurrencyPrecision currency(UCurrencyUsage currencyUsage);
00652
00653 private:
00654 enum PrecisionType {
00655 RND_BOGUS,
00656 RND_NONE,
00657 RND_FRACTION,
00658 RND_SIGNIFICANT,
00659 RND_FRACTION_SIGNIFICANT,
00660
00661
00662 RND_INCREMENT,
00663
00664
00665
00666
00667 RND_INCREMENT_ONE,
00668
00669
00670 RND_INCREMENT_FIVE,
00671
00672 RND_CURRENCY,
00673 RND_ERROR
00674 } fType;
00675
00676 union PrecisionUnion {
00678 struct FractionSignificantSettings {
00679
00681 impl::digits_t fMinFrac;
00683 impl::digits_t fMaxFrac;
00685 impl::digits_t fMinSig;
00687 impl::digits_t fMaxSig;
00688 } fracSig;
00690 struct IncrementSettings {
00691
00693 double fIncrement;
00695 impl::digits_t fMinFrac;
00697 impl::digits_t fMaxFrac;
00698 } increment;
00699 UCurrencyUsage currencyUsage;
00700 UErrorCode errorCode;
00701 } fUnion;
00702
00703 typedef PrecisionUnion::FractionSignificantSettings FractionSignificantSettings;
00704 typedef PrecisionUnion::IncrementSettings IncrementSettings;
00705
00707 UNumberFormatRoundingMode fRoundingMode;
00708
00709 Precision(const PrecisionType& type, const PrecisionUnion& union_,
00710 UNumberFormatRoundingMode roundingMode)
00711 : fType(type), fUnion(union_), fRoundingMode(roundingMode) {}
00712
00713 Precision(UErrorCode errorCode) : fType(RND_ERROR) {
00714 fUnion.errorCode = errorCode;
00715 }
00716
00717 Precision() : fType(RND_BOGUS) {}
00718
00719 bool isBogus() const {
00720 return fType == RND_BOGUS;
00721 }
00722
00723 UBool copyErrorTo(UErrorCode &status) const {
00724 if (fType == RND_ERROR) {
00725 status = fUnion.errorCode;
00726 return TRUE;
00727 }
00728 return FALSE;
00729 }
00730
00731
00732 Precision withCurrency(const CurrencyUnit ¤cy, UErrorCode &status) const;
00733
00734 static FractionPrecision constructFraction(int32_t minFrac, int32_t maxFrac);
00735
00736 static Precision constructSignificant(int32_t minSig, int32_t maxSig);
00737
00738 static Precision
00739 constructFractionSignificant(const FractionPrecision &base, int32_t minSig, int32_t maxSig);
00740
00741 static IncrementPrecision constructIncrement(double increment, int32_t minFrac);
00742
00743 static CurrencyPrecision constructCurrency(UCurrencyUsage usage);
00744
00745 static Precision constructPassThrough();
00746
00747
00748 friend struct impl::MacroProps;
00749 friend struct impl::MicroProps;
00750
00751
00752 friend class impl::NumberFormatterImpl;
00753
00754
00755 friend class impl::NumberPropertyMapper;
00756
00757
00758 friend class impl::RoundingImpl;
00759
00760
00761 friend class FractionPrecision;
00762 friend class CurrencyPrecision;
00763 friend class IncrementPrecision;
00764
00765
00766 friend class impl::GeneratorHelpers;
00767 };
00768
00778 class U_I18N_API FractionPrecision : public Precision {
00779 public:
00796 Precision withMinDigits(int32_t minSignificantDigits) const;
00797
00815 Precision withMaxDigits(int32_t maxSignificantDigits) const;
00816
00817 private:
00818
00819 using Precision::Precision;
00820
00821
00822 friend class Precision;
00823 };
00824
00834 class U_I18N_API CurrencyPrecision : public Precision {
00835 public:
00853 Precision withCurrency(const CurrencyUnit ¤cy) const;
00854
00855 private:
00856
00857 using Precision::Precision;
00858
00859
00860 friend class Precision;
00861 };
00862
00872 class U_I18N_API IncrementPrecision : public Precision {
00873 public:
00889 Precision withMinFraction(int32_t minFrac) const;
00890
00891 private:
00892
00893 using Precision::Precision;
00894
00895
00896 friend class Precision;
00897 };
00898
00908 class U_I18N_API IntegerWidth : public UMemory {
00909 public:
00921 static IntegerWidth zeroFillTo(int32_t minInt);
00922
00934 IntegerWidth truncateAt(int32_t maxInt);
00935
00936 private:
00937 union {
00938 struct {
00939 impl::digits_t fMinInt;
00940 impl::digits_t fMaxInt;
00941 bool fFormatFailIfMoreThanMaxDigits;
00942 } minMaxInt;
00943 UErrorCode errorCode;
00944 } fUnion;
00945 bool fHasError = false;
00946
00947 IntegerWidth(impl::digits_t minInt, impl::digits_t maxInt, bool formatFailIfMoreThanMaxDigits);
00948
00949 IntegerWidth(UErrorCode errorCode) {
00950 fUnion.errorCode = errorCode;
00951 fHasError = true;
00952 }
00953
00954 IntegerWidth() {
00955 fUnion.minMaxInt.fMinInt = -1;
00956 }
00957
00959 static IntegerWidth standard() {
00960 return IntegerWidth::zeroFillTo(1);
00961 }
00962
00963 bool isBogus() const {
00964 return !fHasError && fUnion.minMaxInt.fMinInt == -1;
00965 }
00966
00967 UBool copyErrorTo(UErrorCode &status) const {
00968 if (fHasError) {
00969 status = fUnion.errorCode;
00970 return TRUE;
00971 }
00972 return FALSE;
00973 }
00974
00975 void apply(impl::DecimalQuantity &quantity, UErrorCode &status) const;
00976
00977 bool operator==(const IntegerWidth& other) const;
00978
00979
00980 friend struct impl::MacroProps;
00981 friend struct impl::MicroProps;
00982
00983
00984 friend class impl::NumberFormatterImpl;
00985
00986
00987 friend class impl::NumberPropertyMapper;
00988
00989
00990 friend class impl::GeneratorHelpers;
00991 };
00992
01001 class U_I18N_API Scale : public UMemory {
01002 public:
01009 static Scale none();
01010
01021 static Scale powerOfTen(int32_t power);
01022
01035 static Scale byDecimal(StringPiece multiplicand);
01036
01045 static Scale byDouble(double multiplicand);
01046
01053 static Scale byDoubleAndPowerOfTen(double multiplicand, int32_t power);
01054
01055
01056
01057
01059 Scale(const Scale& other);
01060
01062 Scale& operator=(const Scale& other);
01063
01065 Scale(Scale&& src) U_NOEXCEPT;
01066
01068 Scale& operator=(Scale&& src) U_NOEXCEPT;
01069
01071 ~Scale();
01072
01073 #ifndef U_HIDE_INTERNAL_API
01074
01075 Scale(int32_t magnitude, impl::DecNum* arbitraryToAdopt);
01076 #endif
01077
01078 private:
01079 int32_t fMagnitude;
01080 impl::DecNum* fArbitrary;
01081 UErrorCode fError;
01082
01083 Scale(UErrorCode error) : fMagnitude(0), fArbitrary(nullptr), fError(error) {}
01084
01085 Scale() : fMagnitude(0), fArbitrary(nullptr), fError(U_ZERO_ERROR) {}
01086
01087 bool isValid() const {
01088 return fMagnitude != 0 || fArbitrary != nullptr;
01089 }
01090
01091 UBool copyErrorTo(UErrorCode &status) const {
01092 if (fError != U_ZERO_ERROR) {
01093 status = fError;
01094 return TRUE;
01095 }
01096 return FALSE;
01097 }
01098
01099 void applyTo(impl::DecimalQuantity& quantity) const;
01100
01101 void applyReciprocalTo(impl::DecimalQuantity& quantity) const;
01102
01103
01104 friend struct impl::MacroProps;
01105 friend struct impl::MicroProps;
01106
01107
01108 friend class impl::NumberFormatterImpl;
01109
01110
01111 friend class impl::MultiplierFormatHandler;
01112
01113
01114 friend class impl::GeneratorHelpers;
01115
01116
01117 friend class ::icu::numparse::impl::NumberParserImpl;
01118 friend class ::icu::numparse::impl::MultiplierParseHandler;
01119 };
01120
01121 namespace impl {
01122
01123
01125 class U_I18N_API SymbolsWrapper : public UMemory {
01126 public:
01128 SymbolsWrapper() : fType(SYMPTR_NONE), fPtr{nullptr} {}
01129
01131 SymbolsWrapper(const SymbolsWrapper &other);
01132
01134 SymbolsWrapper &operator=(const SymbolsWrapper &other);
01135
01137 SymbolsWrapper(SymbolsWrapper&& src) U_NOEXCEPT;
01138
01140 SymbolsWrapper &operator=(SymbolsWrapper&& src) U_NOEXCEPT;
01141
01143 ~SymbolsWrapper();
01144
01145 #ifndef U_HIDE_INTERNAL_API
01146
01151 void setTo(const DecimalFormatSymbols &dfs);
01152
01157 void setTo(const NumberingSystem *ns);
01158
01163 bool isDecimalFormatSymbols() const;
01164
01169 bool isNumberingSystem() const;
01170
01175 const DecimalFormatSymbols *getDecimalFormatSymbols() const;
01176
01181 const NumberingSystem *getNumberingSystem() const;
01182
01183 #endif // U_HIDE_INTERNAL_API
01184
01186 UBool copyErrorTo(UErrorCode &status) const {
01187 if (fType == SYMPTR_DFS && fPtr.dfs == nullptr) {
01188 status = U_MEMORY_ALLOCATION_ERROR;
01189 return TRUE;
01190 } else if (fType == SYMPTR_NS && fPtr.ns == nullptr) {
01191 status = U_MEMORY_ALLOCATION_ERROR;
01192 return TRUE;
01193 }
01194 return FALSE;
01195 }
01196
01197 private:
01198 enum SymbolsPointerType {
01199 SYMPTR_NONE, SYMPTR_DFS, SYMPTR_NS
01200 } fType;
01201
01202 union {
01203 const DecimalFormatSymbols *dfs;
01204 const NumberingSystem *ns;
01205 } fPtr;
01206
01207 void doCopyFrom(const SymbolsWrapper &other);
01208
01209 void doMoveFrom(SymbolsWrapper&& src);
01210
01211 void doCleanup();
01212 };
01213
01214
01216 class U_I18N_API Grouper : public UMemory {
01217 public:
01218 #ifndef U_HIDE_INTERNAL_API
01219
01220 static Grouper forStrategy(UNumberGroupingStrategy grouping);
01221
01226 static Grouper forProperties(const DecimalFormatProperties& properties);
01227
01228
01229
01231 Grouper(int16_t grouping1, int16_t grouping2, int16_t minGrouping, UNumberGroupingStrategy strategy)
01232 : fGrouping1(grouping1),
01233 fGrouping2(grouping2),
01234 fMinGrouping(minGrouping),
01235 fStrategy(strategy) {}
01236 #endif // U_HIDE_INTERNAL_API
01237
01239 int16_t getPrimary() const;
01240
01242 int16_t getSecondary() const;
01243
01244 private:
01253 int16_t fGrouping1;
01254 int16_t fGrouping2;
01255
01263 int16_t fMinGrouping;
01264
01269 UNumberGroupingStrategy fStrategy;
01270
01271 Grouper() : fGrouping1(-3) {}
01272
01273 bool isBogus() const {
01274 return fGrouping1 == -3;
01275 }
01276
01278 void setLocaleData(const impl::ParsedPatternInfo &patternInfo, const Locale& locale);
01279
01280 bool groupAtPosition(int32_t position, const impl::DecimalQuantity &value) const;
01281
01282
01283 friend struct MacroProps;
01284 friend struct MicroProps;
01285
01286
01287 friend class NumberFormatterImpl;
01288
01289
01290 friend class ::icu::numparse::impl::NumberParserImpl;
01291
01292
01293 friend class impl::GeneratorHelpers;
01294 };
01295
01296
01298 class U_I18N_API Padder : public UMemory {
01299 public:
01300 #ifndef U_HIDE_INTERNAL_API
01301
01302 static Padder none();
01303
01305 static Padder codePoints(UChar32 cp, int32_t targetWidth, UNumberFormatPadPosition position);
01306 #endif // U_HIDE_INTERNAL_API
01307
01309 static Padder forProperties(const DecimalFormatProperties& properties);
01310
01311 private:
01312 UChar32 fWidth;
01313 union {
01314 struct {
01315 int32_t fCp;
01316 UNumberFormatPadPosition fPosition;
01317 } padding;
01318 UErrorCode errorCode;
01319 } fUnion;
01320
01321 Padder(UChar32 cp, int32_t width, UNumberFormatPadPosition position);
01322
01323 Padder(int32_t width);
01324
01325 Padder(UErrorCode errorCode) : fWidth(-3) {
01326 fUnion.errorCode = errorCode;
01327 }
01328
01329 Padder() : fWidth(-2) {}
01330
01331 bool isBogus() const {
01332 return fWidth == -2;
01333 }
01334
01335 UBool copyErrorTo(UErrorCode &status) const {
01336 if (fWidth == -3) {
01337 status = fUnion.errorCode;
01338 return TRUE;
01339 }
01340 return FALSE;
01341 }
01342
01343 bool isValid() const {
01344 return fWidth > 0;
01345 }
01346
01347 int32_t padAndApply(const impl::Modifier &mod1, const impl::Modifier &mod2,
01348 FormattedStringBuilder &string, int32_t leftIndex, int32_t rightIndex,
01349 UErrorCode &status) const;
01350
01351
01352 friend struct MacroProps;
01353 friend struct MicroProps;
01354
01355
01356 friend class impl::NumberFormatterImpl;
01357
01358
01359 friend class impl::GeneratorHelpers;
01360 };
01361
01362
01364 struct U_I18N_API MacroProps : public UMemory {
01366 Notation notation;
01367
01369 MeasureUnit unit;
01370
01372 MeasureUnit perUnit;
01373
01375 Precision precision;
01376
01378 UNumberFormatRoundingMode roundingMode = UNUM_ROUND_HALFEVEN;
01379
01381 Grouper grouper;
01382
01384 Padder padder;
01385
01387 IntegerWidth integerWidth;
01388
01390 SymbolsWrapper symbols;
01391
01392
01393
01395 UNumberUnitWidth unitWidth = UNUM_UNIT_WIDTH_COUNT;
01396
01398 UNumberSignDisplay sign = UNUM_SIGN_COUNT;
01399
01401 UNumberDecimalSeparatorDisplay decimal = UNUM_DECIMAL_SEPARATOR_COUNT;
01402
01404 Scale scale;
01405
01407 const AffixPatternProvider* affixProvider = nullptr;
01408
01410 const PluralRules* rules = nullptr;
01411
01413 const CurrencySymbols* currencySymbols = nullptr;
01414
01416 int32_t threshold = kInternalDefaultThreshold;
01417
01419 Locale locale;
01420
01421
01422
01427 bool copyErrorTo(UErrorCode &status) const {
01428 return notation.copyErrorTo(status) || precision.copyErrorTo(status) ||
01429 padder.copyErrorTo(status) || integerWidth.copyErrorTo(status) ||
01430 symbols.copyErrorTo(status) || scale.copyErrorTo(status);
01431 }
01432 };
01433
01434 }
01435
01441 template<typename Derived>
01442 class U_I18N_API NumberFormatterSettings {
01443 public:
01472 Derived notation(const Notation ¬ation) const &;
01473
01483 Derived notation(const Notation ¬ation) &&;
01484
01528 Derived unit(const icu::MeasureUnit &unit) const &;
01529
01539 Derived unit(const icu::MeasureUnit &unit) &&;
01540
01554 Derived adoptUnit(icu::MeasureUnit *unit) const &;
01555
01565 Derived adoptUnit(icu::MeasureUnit *unit) &&;
01566
01589 Derived perUnit(const icu::MeasureUnit &perUnit) const &;
01590
01600 Derived perUnit(const icu::MeasureUnit &perUnit) &&;
01601
01615 Derived adoptPerUnit(icu::MeasureUnit *perUnit) const &;
01616
01626 Derived adoptPerUnit(icu::MeasureUnit *perUnit) &&;
01627
01658 Derived precision(const Precision& precision) const &;
01659
01669 Derived precision(const Precision& precision) &&;
01670
01689 Derived roundingMode(UNumberFormatRoundingMode roundingMode) const &;
01690
01699 Derived roundingMode(UNumberFormatRoundingMode roundingMode) &&;
01700
01728 Derived grouping(UNumberGroupingStrategy strategy) const &;
01729
01739 Derived grouping(UNumberGroupingStrategy strategy) &&;
01740
01765 Derived integerWidth(const IntegerWidth &style) const &;
01766
01776 Derived integerWidth(const IntegerWidth &style) &&;
01777
01818 Derived symbols(const DecimalFormatSymbols &symbols) const &;
01819
01829 Derived symbols(const DecimalFormatSymbols &symbols) &&;
01830
01864 Derived adoptSymbols(NumberingSystem *symbols) const &;
01865
01875 Derived adoptSymbols(NumberingSystem *symbols) &&;
01876
01902 Derived unitWidth(UNumberUnitWidth width) const &;
01903
01913 Derived unitWidth(UNumberUnitWidth width) &&;
01914
01940 Derived sign(UNumberSignDisplay style) const &;
01941
01951 Derived sign(UNumberSignDisplay style) &&;
01952
01978 Derived decimal(UNumberDecimalSeparatorDisplay style) const &;
01979
01989 Derived decimal(UNumberDecimalSeparatorDisplay style) &&;
01990
02015 Derived scale(const Scale &scale) const &;
02016
02026 Derived scale(const Scale &scale) &&;
02027
02028 #ifndef U_HIDE_INTERNAL_API
02029
02035 Derived padding(const impl::Padder &padder) const &;
02036
02038 Derived padding(const impl::Padder &padder) &&;
02039
02046 Derived threshold(int32_t threshold) const &;
02047
02049 Derived threshold(int32_t threshold) &&;
02050
02056 Derived macros(const impl::MacroProps& macros) const &;
02057
02059 Derived macros(const impl::MacroProps& macros) &&;
02060
02062 Derived macros(impl::MacroProps&& macros) const &;
02063
02065 Derived macros(impl::MacroProps&& macros) &&;
02066
02067 #endif
02068
02083 UnicodeString toSkeleton(UErrorCode& status) const;
02084
02085 #ifndef U_HIDE_DRAFT_API
02086
02097 LocalPointer<Derived> clone() const &;
02098
02106 LocalPointer<Derived> clone() &&;
02107 #endif
02108
02115 UBool copyErrorTo(UErrorCode &outErrorCode) const {
02116 if (U_FAILURE(outErrorCode)) {
02117
02118 return TRUE;
02119 }
02120 fMacros.copyErrorTo(outErrorCode);
02121 return U_FAILURE(outErrorCode);
02122 }
02123
02124
02125
02126 private:
02127 impl::MacroProps fMacros;
02128
02129
02130 NumberFormatterSettings() = default;
02131
02132 friend class LocalizedNumberFormatter;
02133 friend class UnlocalizedNumberFormatter;
02134
02135
02136 friend void impl::touchRangeLocales(impl::RangeMacroProps& macros);
02137 friend class impl::NumberRangeFormatterImpl;
02138 };
02139
02148 class U_I18N_API UnlocalizedNumberFormatter
02149 : public NumberFormatterSettings<UnlocalizedNumberFormatter>, public UMemory {
02150
02151 public:
02161 LocalizedNumberFormatter locale(const icu::Locale &locale) const &;
02162
02172 LocalizedNumberFormatter locale(const icu::Locale &locale) &&;
02173
02179 UnlocalizedNumberFormatter() = default;
02180
02185 UnlocalizedNumberFormatter(const UnlocalizedNumberFormatter &other);
02186
02192 UnlocalizedNumberFormatter(UnlocalizedNumberFormatter&& src) U_NOEXCEPT;
02193
02198 UnlocalizedNumberFormatter& operator=(const UnlocalizedNumberFormatter& other);
02199
02205 UnlocalizedNumberFormatter& operator=(UnlocalizedNumberFormatter&& src) U_NOEXCEPT;
02206
02207 private:
02208 explicit UnlocalizedNumberFormatter(const NumberFormatterSettings<UnlocalizedNumberFormatter>& other);
02209
02210 explicit UnlocalizedNumberFormatter(
02211 NumberFormatterSettings<UnlocalizedNumberFormatter>&& src) U_NOEXCEPT;
02212
02213
02214 friend class NumberFormatterSettings<UnlocalizedNumberFormatter>;
02215
02216
02217 friend class NumberFormatter;
02218 };
02219
02228 class U_I18N_API LocalizedNumberFormatter
02229 : public NumberFormatterSettings<LocalizedNumberFormatter>, public UMemory {
02230 public:
02242 FormattedNumber formatInt(int64_t value, UErrorCode &status) const;
02243
02255 FormattedNumber formatDouble(double value, UErrorCode &status) const;
02256
02271 FormattedNumber formatDecimal(StringPiece value, UErrorCode& status) const;
02272
02273 #ifndef U_HIDE_INTERNAL_API
02274
02278 FormattedNumber formatDecimalQuantity(const impl::DecimalQuantity& dq, UErrorCode& status) const;
02279
02283 void getAffixImpl(bool isPrefix, bool isNegative, UnicodeString& result, UErrorCode& status) const;
02284
02289 const impl::NumberFormatterImpl* getCompiled() const;
02290
02295 int32_t getCallCount() const;
02296
02297 #endif
02298
02312 Format* toFormat(UErrorCode& status) const;
02313
02319 LocalizedNumberFormatter() = default;
02320
02325 LocalizedNumberFormatter(const LocalizedNumberFormatter &other);
02326
02332 LocalizedNumberFormatter(LocalizedNumberFormatter&& src) U_NOEXCEPT;
02333
02338 LocalizedNumberFormatter& operator=(const LocalizedNumberFormatter& other);
02339
02345 LocalizedNumberFormatter& operator=(LocalizedNumberFormatter&& src) U_NOEXCEPT;
02346
02347 #ifndef U_HIDE_INTERNAL_API
02348
02361 void formatImpl(impl::UFormattedNumberData *results, UErrorCode &status) const;
02362
02363 #endif
02364
02369 ~LocalizedNumberFormatter();
02370
02371 private:
02372
02373
02374 const impl::NumberFormatterImpl* fCompiled {nullptr};
02375 char fUnsafeCallCount[8] {};
02376
02377 explicit LocalizedNumberFormatter(const NumberFormatterSettings<LocalizedNumberFormatter>& other);
02378
02379 explicit LocalizedNumberFormatter(NumberFormatterSettings<LocalizedNumberFormatter>&& src) U_NOEXCEPT;
02380
02381 LocalizedNumberFormatter(const impl::MacroProps ¯os, const Locale &locale);
02382
02383 LocalizedNumberFormatter(impl::MacroProps &¯os, const Locale &locale);
02384
02385 void clear();
02386
02387 void lnfMoveHelper(LocalizedNumberFormatter&& src);
02388
02392 bool computeCompiled(UErrorCode& status) const;
02393
02394
02395 friend class NumberFormatterSettings<UnlocalizedNumberFormatter>;
02396 friend class NumberFormatterSettings<LocalizedNumberFormatter>;
02397
02398
02399 friend class UnlocalizedNumberFormatter;
02400 };
02401
02410 class U_I18N_API FormattedNumber : public UMemory, public FormattedValue {
02411 public:
02412
02413
02414 #ifndef U_FORCE_HIDE_DRAFT_API
02415
02419 FormattedNumber()
02420 : fData(nullptr), fErrorCode(U_INVALID_STATE_ERROR) {}
02421 #endif // U_FORCE_HIDE_DRAFT_API
02422
02427 FormattedNumber(FormattedNumber&& src) U_NOEXCEPT;
02428
02433 virtual ~FormattedNumber() U_OVERRIDE;
02434
02436 FormattedNumber(const FormattedNumber&) = delete;
02437
02439 FormattedNumber& operator=(const FormattedNumber&) = delete;
02440
02445 FormattedNumber& operator=(FormattedNumber&& src) U_NOEXCEPT;
02446
02447
02455 UnicodeString toString(UErrorCode& status) const U_OVERRIDE;
02456
02457
02459 UnicodeString toTempString(UErrorCode& status) const U_OVERRIDE;
02460
02461
02469 Appendable &appendTo(Appendable& appendable, UErrorCode& status) const U_OVERRIDE;
02470
02471
02473 UBool nextPosition(ConstrainedFieldPosition& cfpos, UErrorCode& status) const U_OVERRIDE;
02474
02475 #ifndef U_HIDE_DRAFT_API
02476
02509 UBool nextFieldPosition(FieldPosition& fieldPosition, UErrorCode& status) const;
02510
02526 void getAllFieldPositions(FieldPositionIterator &iterator, UErrorCode &status) const;
02527 #endif
02528
02529 #ifndef U_HIDE_DRAFT_API
02530
02548 template<typename StringClass>
02549 inline StringClass toDecimalNumber(UErrorCode& status) const;
02550 #endif // U_HIDE_DRAFT_API
02551
02552 #ifndef U_HIDE_INTERNAL_API
02553
02558 void getDecimalQuantity(impl::DecimalQuantity& output, UErrorCode& status) const;
02559
02564 void getAllFieldPositionsImpl(FieldPositionIteratorHandler& fpih, UErrorCode& status) const;
02565
02566 #endif
02567
02568 private:
02569
02570 const impl::UFormattedNumberData *fData;
02571
02572
02573 UErrorCode fErrorCode;
02574
02579 explicit FormattedNumber(impl::UFormattedNumberData *results)
02580 : fData(results), fErrorCode(U_ZERO_ERROR) {}
02581
02582 explicit FormattedNumber(UErrorCode errorCode)
02583 : fData(nullptr), fErrorCode(errorCode) {}
02584
02585
02586 void toDecimalNumber(ByteSink& sink, UErrorCode& status) const;
02587
02588
02589 friend class LocalizedNumberFormatter;
02590
02591
02592 friend struct impl::UFormattedNumberImpl;
02593 };
02594
02595 #ifndef U_HIDE_DRAFT_API
02596
02597 template<typename StringClass>
02598 StringClass FormattedNumber::toDecimalNumber(UErrorCode& status) const {
02599 StringClass result;
02600 StringByteSink<StringClass> sink(&result);
02601 toDecimalNumber(sink, status);
02602 return result;
02603 };
02604 #endif // U_HIDE_DRAFT_API
02605
02611 class U_I18N_API NumberFormatter final {
02612 public:
02620 static UnlocalizedNumberFormatter with();
02621
02631 static LocalizedNumberFormatter withLocale(const Locale &locale);
02632
02647 static UnlocalizedNumberFormatter forSkeleton(const UnicodeString& skeleton, UErrorCode& status);
02648
02649 #ifndef U_HIDE_DRAFT_API
02650
02667 static UnlocalizedNumberFormatter forSkeleton(const UnicodeString& skeleton,
02668 UParseError& perror, UErrorCode& status);
02669 #endif
02670
02674 NumberFormatter() = delete;
02675 };
02676
02677 }
02678 U_NAMESPACE_END
02679
02680 #endif
02681
02682 #endif
02683
02684 #endif // __NUMBERFORMATTER_H__
02685