00001
00002
00003
00004 #ifndef __SIMPLENUMBERFORMATTERH__
00005 #define __SIMPLENUMBERFORMATTERH__
00006
00007 #include "unicode/utypes.h"
00008
00009 #if U_SHOW_CPLUSPLUS_API
00010
00011 #if !UCONFIG_NO_FORMATTING
00012
00013 #include "unicode/dcfmtsym.h"
00014 #include "unicode/usimplenumberformatter.h"
00015 #include "unicode/formattednumber.h"
00016
00031 U_NAMESPACE_BEGIN
00032
00033
00034 namespace number {
00035
00036
00037 namespace impl {
00038 class UFormattedNumberData;
00039 struct SimpleMicroProps;
00040 class AdoptingSignumModifierStore;
00041 }
00042
00043
00044 #ifndef U_HIDE_DRAFT_API
00045
00046
00054 class U_I18N_API SimpleNumber : public UMemory {
00055 public:
00061 static SimpleNumber forInt64(int64_t value, UErrorCode& status);
00062
00070 void multiplyByPowerOfTen(int32_t power, UErrorCode& status);
00071
00079 void roundTo(int32_t power, UNumberFormatRoundingMode roundingMode, UErrorCode& status);
00080
00088 void truncateStart(uint32_t maximumIntegerDigits, UErrorCode& status);
00089
00097 void setMinimumIntegerDigits(uint32_t minimumIntegerDigits, UErrorCode& status);
00098
00106 void setMinimumFractionDigits(uint32_t minimumFractionDigits, UErrorCode& status);
00107
00117 void setSign(USimpleNumberSign sign, UErrorCode& status);
00118
00126 SimpleNumber() = default;
00127
00133 ~SimpleNumber() {
00134 cleanup();
00135 }
00136
00142 SimpleNumber(SimpleNumber&& other) noexcept {
00143 fData = other.fData;
00144 fSign = other.fSign;
00145 other.fData = nullptr;
00146 }
00147
00153 SimpleNumber& operator=(SimpleNumber&& other) noexcept {
00154 cleanup();
00155 fData = other.fData;
00156 fSign = other.fSign;
00157 other.fData = nullptr;
00158 return *this;
00159 }
00160
00161 private:
00162 SimpleNumber(impl::UFormattedNumberData* data, UErrorCode& status);
00163 SimpleNumber(const SimpleNumber&) = delete;
00164 SimpleNumber& operator=(const SimpleNumber&) = delete;
00165
00166 void cleanup();
00167
00168 impl::UFormattedNumberData* fData = nullptr;
00169 USimpleNumberSign fSign = UNUM_SIMPLE_NUMBER_NO_SIGN;
00170
00171 friend class SimpleNumberFormatter;
00172 };
00173
00174
00185 class U_I18N_API SimpleNumberFormatter : public UMemory {
00186 public:
00192 static SimpleNumberFormatter forLocale(
00193 const icu::Locale &locale,
00194 UErrorCode &status);
00195
00201 static SimpleNumberFormatter forLocaleAndGroupingStrategy(
00202 const icu::Locale &locale,
00203 UNumberGroupingStrategy groupingStrategy,
00204 UErrorCode &status);
00205
00214 static SimpleNumberFormatter forLocaleAndSymbolsAndGroupingStrategy(
00215 const icu::Locale &locale,
00216 const DecimalFormatSymbols &symbols,
00217 UNumberGroupingStrategy groupingStrategy,
00218 UErrorCode &status);
00219
00228 FormattedNumber format(SimpleNumber value, UErrorCode &status) const;
00229
00237 FormattedNumber formatInt64(int64_t value, UErrorCode &status) const {
00238 return format(SimpleNumber::forInt64(value, status), status);
00239 }
00240
00241 #ifndef U_HIDE_INTERNAL_API
00242
00246 void formatImpl(impl::UFormattedNumberData* data, USimpleNumberSign sign, UErrorCode& status) const;
00247 #endif // U_HIDE_INTERNAL_API
00248
00254 ~SimpleNumberFormatter() {
00255 cleanup();
00256 }
00257
00263 SimpleNumberFormatter() = default;
00264
00270 SimpleNumberFormatter(SimpleNumberFormatter&& other) noexcept {
00271 fGroupingStrategy = other.fGroupingStrategy;
00272 fOwnedSymbols = other.fOwnedSymbols;
00273 fMicros = other.fMicros;
00274 fPatternModifier = other.fPatternModifier;
00275 other.fOwnedSymbols = nullptr;
00276 other.fMicros = nullptr;
00277 other.fPatternModifier = nullptr;
00278 }
00279
00285 SimpleNumberFormatter& operator=(SimpleNumberFormatter&& other) noexcept {
00286 cleanup();
00287 fGroupingStrategy = other.fGroupingStrategy;
00288 fOwnedSymbols = other.fOwnedSymbols;
00289 fMicros = other.fMicros;
00290 fPatternModifier = other.fPatternModifier;
00291 other.fOwnedSymbols = nullptr;
00292 other.fMicros = nullptr;
00293 other.fPatternModifier = nullptr;
00294 return *this;
00295 }
00296
00297 private:
00298 void initialize(
00299 const icu::Locale &locale,
00300 const DecimalFormatSymbols &symbols,
00301 UNumberGroupingStrategy groupingStrategy,
00302 UErrorCode &status);
00303
00304 void cleanup();
00305
00306 SimpleNumberFormatter(const SimpleNumberFormatter&) = delete;
00307
00308 SimpleNumberFormatter& operator=(const SimpleNumberFormatter&) = delete;
00309
00310 UNumberGroupingStrategy fGroupingStrategy = UNUM_GROUPING_AUTO;
00311
00312
00313 DecimalFormatSymbols* fOwnedSymbols = nullptr;
00314 impl::SimpleMicroProps* fMicros = nullptr;
00315 impl::AdoptingSignumModifierStore* fPatternModifier = nullptr;
00316 };
00317
00318
00319 #endif // U_HIDE_DRAFT_API
00320
00321 }
00322 U_NAMESPACE_END
00323
00324 #endif
00325
00326 #endif
00327
00328 #endif // __SIMPLENUMBERFORMATTERH__
00329