00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
#ifndef DECIMFMT_H
00025
#define DECIMFMT_H
00026
00027
#include "unicode/utypes.h"
00028
00029
#if !UCONFIG_NO_FORMATTING
00030
00031
#include "unicode/dcfmtsym.h"
00032
#include "unicode/numfmt.h"
00033
#include "unicode/locid.h"
00034
00035
U_NAMESPACE_BEGIN
00036
00037
class DigitList;
00038
class ChoiceFormat;
00039
00184 class U_I18N_API DecimalFormat:
public NumberFormat {
00185
public:
00189 enum ERoundingMode {
00190 kRoundCeiling,
00191 kRoundFloor,
00192 kRoundDown,
00193 kRoundUp,
00194 kRoundHalfEven,
00195 kRoundHalfDown,
00196 kRoundHalfUp
00197
00198 };
00199
00203 enum EPadPosition {
00204 kPadBeforePrefix,
00205 kPadAfterPrefix,
00206 kPadBeforeSuffix,
00207 kPadAfterSuffix
00208 };
00209
00223 DecimalFormat(
UErrorCode& status);
00224
00239 DecimalFormat(
const UnicodeString& pattern,
00240
UErrorCode& status);
00241
00260 DecimalFormat(
const UnicodeString& pattern,
00261
DecimalFormatSymbols* symbolsToAdopt,
00262
UErrorCode& status);
00263
00283 DecimalFormat(
const UnicodeString& pattern,
00284
DecimalFormatSymbols* symbolsToAdopt,
00285
UParseError& parseError,
00286
UErrorCode& status);
00304 DecimalFormat(
const UnicodeString& pattern,
00305
const DecimalFormatSymbols& symbols,
00306
UErrorCode& status);
00307
00314 DecimalFormat(
const DecimalFormat& source);
00315
00322 DecimalFormat&
operator=(
const DecimalFormat& rhs);
00323
00328
virtual ~DecimalFormat();
00329
00337
virtual Format*
clone(
void) const;
00338
00347 virtual
UBool operator==(const
Format& other) const;
00348
00360 virtual
UnicodeString& format(
double number,
00361
UnicodeString& appendTo,
00362
FieldPosition& pos) const;
00374 virtual
UnicodeString& format(int32_t number,
00375
UnicodeString& appendTo,
00376
FieldPosition& pos) const;
00388 virtual
UnicodeString& format(int64_t number,
00389
UnicodeString& appendTo,
00390
FieldPosition& pos) const;
00391
00404 virtual
UnicodeString& format(const
Formattable& obj,
00405
UnicodeString& appendTo,
00406
FieldPosition& pos,
00407
UErrorCode& status) const;
00408
00420
UnicodeString& format(const
Formattable& obj,
00421
UnicodeString& appendTo,
00422
UErrorCode& status) const;
00423
00434
UnicodeString& format(
double number,
00435
UnicodeString& appendTo) const;
00436
00448
UnicodeString& format(int32_t number,
00449
UnicodeString& appendTo) const;
00450
00462
UnicodeString& format(int64_t number,
00463
UnicodeString& appendTo) const;
00483 virtual
void parse(const
UnicodeString& text,
00484
Formattable& result,
00485
ParsePosition& parsePosition) const;
00486
00487
00496 virtual
void parse(const
UnicodeString& text,
00497
Formattable& result,
00498
UErrorCode& status) const;
00499
00507 virtual const
DecimalFormatSymbols* getDecimalFormatSymbols(
void) const;
00508
00515 virtual
void adoptDecimalFormatSymbols(
DecimalFormatSymbols* symbolsToAdopt);
00516
00523 virtual
void setDecimalFormatSymbols(const
DecimalFormatSymbols& symbols);
00524
00525
00534
UnicodeString& getPositivePrefix(
UnicodeString& result) const;
00535
00543 virtual
void setPositivePrefix(const
UnicodeString& newValue);
00544
00553
UnicodeString& getNegativePrefix(
UnicodeString& result) const;
00554
00562 virtual
void setNegativePrefix(const
UnicodeString& newValue);
00563
00572
UnicodeString& getPositiveSuffix(
UnicodeString& result) const;
00573
00581 virtual
void setPositiveSuffix(const
UnicodeString& newValue);
00582
00591
UnicodeString& getNegativeSuffix(
UnicodeString& result) const;
00592
00600 virtual
void setNegativeSuffix(const
UnicodeString& newValue);
00601
00612 int32_t getMultiplier(
void) const;
00613
00624 virtual
void setMultiplier(int32_t newValue);
00625
00635 virtual
double getRoundingIncrement(
void);
00636
00647 virtual
void setRoundingIncrement(
double newValue);
00648
00657 virtual ERoundingMode getRoundingMode(
void);
00658
00668 virtual
void setRoundingMode(ERoundingMode roundingMode);
00669
00680 virtual int32_t getFormatWidth(
void);
00681
00695 virtual
void setFormatWidth(int32_t width);
00696
00710 virtual
UnicodeString getPadCharacterString();
00711
00726 virtual
void setPadCharacter(const
UnicodeString &padChar);
00727
00746 virtual EPadPosition getPadPosition(
void);
00747
00768 virtual
void setPadPosition(EPadPosition padPos);
00769
00780 virtual
UBool isScientificNotation(
void);
00781
00797 virtual
void setScientificNotation(
UBool useScientific);
00798
00809 virtual int8_t getMinimumExponentDigits(
void);
00810
00823 virtual
void setMinimumExponentDigits(int8_t minExpDig);
00824
00837 virtual
UBool isExponentSignAlwaysShown(
void);
00838
00852 virtual
void setExponentSignAlwaysShown(
UBool expSignAlways);
00853
00865 int32_t getGroupingSize(
void) const;
00866
00878 virtual
void setGroupingSize(int32_t newValue);
00879
00898 int32_t getSecondaryGroupingSize(
void) const;
00899
00911 virtual
void setSecondaryGroupingSize(int32_t newValue);
00912
00921
UBool isDecimalSeparatorAlwaysShown(
void) const;
00922
00931 virtual
void setDecimalSeparatorAlwaysShown(
UBool newValue);
00932
00943 virtual
UnicodeString& toPattern(
UnicodeString& result) const;
00944
00955 virtual
UnicodeString& toLocalizedPattern(
UnicodeString& result) const;
00956
00986 virtual
void applyPattern(const
UnicodeString& pattern,
00987
UParseError& parseError,
00988
UErrorCode& status);
00997 virtual
void applyPattern(const
UnicodeString& pattern,
00998
UErrorCode& status);
00999
01030 virtual
void applyLocalizedPattern(const
UnicodeString& pattern,
01031
UParseError& parseError,
01032
UErrorCode& status);
01033
01043 virtual
void applyLocalizedPattern(const
UnicodeString& pattern,
01044
UErrorCode& status);
01045
01046
01056 virtual
void setMaximumIntegerDigits(int32_t newValue);
01057
01067 virtual
void setMinimumIntegerDigits(int32_t newValue);
01068
01078 virtual
void setMaximumFractionDigits(int32_t newValue);
01079
01089 virtual
void setMinimumFractionDigits(int32_t newValue);
01090
01101 virtual
void setCurrency(const
UChar* theCurrency);
01102
01108 static const
char fgNumberPatterns[];
01109
01110 public:
01111
01123 static
UClassID getStaticClassID(
void);
01124
01136 virtual
UClassID getDynamicClassID(
void) const;
01137
01138 private:
01139 DecimalFormat();
01140
01141 int32_t precision(
UBool isIntegral) const;
01142
01146
void construct(
UErrorCode& status,
01147
UParseError& parseErr,
01148 const
UnicodeString* pattern = 0,
01149
DecimalFormatSymbols* symbolsToAdopt = 0
01150 );
01151
01160
UnicodeString& toPattern(
UnicodeString& result,
UBool localized) const;
01161
01172
void applyPattern(const
UnicodeString& pattern,
01173
UBool localized,
01174
UParseError& parseError,
01175
UErrorCode& status);
01187
UnicodeString& subformat(
UnicodeString& appendTo,
01188
FieldPosition& fieldPosition,
01189 DigitList& digits,
01190
UBool isInteger) const;
01191
01192 enum {
01193 fgStatusInfinite,
01194 fgStatusLength
01195 } StatusFlags;
01196
01209
UBool subparse(
const UnicodeString& text,
ParsePosition& parsePosition,
01210 DigitList& digits,
UBool* status)
const;
01211
01212 int32_t skipPadding(
const UnicodeString& text, int32_t position)
const;
01213
01214 int32_t compareAffix(
const UnicodeString& input,
01215 int32_t pos,
01216
UBool isNegative,
01217
UBool isPrefix)
const;
01218
01219
static int32_t compareSimpleAffix(
const UnicodeString& affix,
01220
const UnicodeString& input,
01221 int32_t pos);
01222
01223
static int32_t skipRuleWhiteSpace(
const UnicodeString& text, int32_t pos);
01224
01225
static int32_t skipUWhiteSpace(
const UnicodeString& text, int32_t pos);
01226
01227 int32_t compareComplexAffix(
const UnicodeString& affixPat,
01228
const UnicodeString& input,
01229 int32_t pos)
const;
01230
01231
static int32_t match(
const UnicodeString& text, int32_t pos,
UChar32 ch);
01232
01233
static int32_t match(
const UnicodeString& text, int32_t pos,
const UnicodeString& str);
01234
01240
inline const UnicodeString &getConstSymbol(DecimalFormatSymbols::ENumberFormatSymbol symbol)
const;
01241
01242 int32_t appendAffix(
UnicodeString& buf,
double number,
01243
UBool isNegative,
UBool isPrefix)
const;
01244
01250
void appendAffixPattern(
UnicodeString& appendTo,
const UnicodeString& affix,
01251
UBool localized)
const;
01252
01253
void appendAffixPattern(
UnicodeString& appendTo,
01254
const UnicodeString* affixPattern,
01255
const UnicodeString& expAffix,
UBool localized)
const;
01256
01257
void expandAffix(
const UnicodeString& pattern,
01258
UnicodeString& affix,
01259
double number,
01260
UBool doFormat)
const;
01261
01262
void expandAffixes();
01263
01264
static double round(
double a, ERoundingMode mode,
UBool isNegative);
01265
01266
void addPadding(
UnicodeString& appendTo,
01267
FieldPosition& fieldPosition,
01268 int32_t prefixLen, int32_t suffixLen)
const;
01269
01270
UBool isGroupingPosition(int32_t pos)
const;
01271
01272
void setCurrencyForSymbols();
01273
01274
void setCurrencyForLocale(
const char* locale,
UErrorCode& ec);
01275
01279
01280
01281
01282
01283
UnicodeString fPositivePrefix;
01284
UnicodeString fPositiveSuffix;
01285
UnicodeString fNegativePrefix;
01286
UnicodeString fNegativeSuffix;
01287
UnicodeString* fPosPrefixPattern;
01288
UnicodeString* fPosSuffixPattern;
01289
UnicodeString* fNegPrefixPattern;
01290
UnicodeString* fNegSuffixPattern;
01291
01297
ChoiceFormat* fCurrencyChoice;
01298
01299 int32_t fMultiplier;
01300 int32_t fGroupingSize;
01301 int32_t fGroupingSize2;
01302
UBool fDecimalSeparatorAlwaysShown;
01303
UBool fIsCurrencyFormat;
01304
DecimalFormatSymbols* fSymbols;
01305
01306
UBool fUseExponentialNotation;
01307 int8_t fMinExponentDigits;
01308
UBool fExponentSignAlwaysShown;
01309
01310
01311
01312
01313
01314 DigitList* fRoundingIncrement;
01315
double fRoundingDouble;
01316 ERoundingMode fRoundingMode;
01317
01318
UChar32 fPad;
01319 int32_t fFormatWidth;
01320 EPadPosition fPadPosition;
01321
01322
protected:
01326 static const int32_t kDoubleIntegerDigits;
01330 static const int32_t kDoubleFractionDigits;
01331
01341 static const int32_t kMaxScientificIntegerDigits;
01342 };
01343
01344
inline UnicodeString&
01345 DecimalFormat::format(
const Formattable& obj,
01346
UnicodeString& appendTo,
01347
UErrorCode& status)
const {
01348
01349
01350
return NumberFormat::format(obj, appendTo, status);
01351 }
01352
01353
inline UnicodeString&
01354 DecimalFormat::format(
double number,
01355
UnicodeString& appendTo)
const {
01356
FieldPosition pos(0);
01357
return format(number, appendTo, pos);
01358 }
01359
01360
inline UnicodeString&
01361 DecimalFormat::format(int32_t number,
01362
UnicodeString& appendTo)
const {
01363
FieldPosition pos(0);
01364
return format((int64_t)number, appendTo, pos);
01365 }
01366
01367
inline const UnicodeString &
01368 DecimalFormat::getConstSymbol(DecimalFormatSymbols::ENumberFormatSymbol symbol)
const {
01369
return fSymbols->
getConstSymbol(symbol);
01370 }
01371
01372
U_NAMESPACE_END
01373
01374
#endif
01375
01376
#endif // _DECIMFMT
01377