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 SMPDTFMT_H
00025 #define SMPDTFMT_H
00026
00027 #include "unicode/utypes.h"
00028
00034 #if !UCONFIG_NO_FORMATTING
00035
00036 #include "unicode/datefmt.h"
00037 #include "unicode/udisplaycontext.h"
00038
00039 U_NAMESPACE_BEGIN
00040
00041 class DateFormatSymbols;
00042 class DateFormat;
00043 class MessageFormat;
00044 class FieldPositionHandler;
00045 class TimeZoneFormat;
00046
00227 class U_I18N_API SimpleDateFormat: public DateFormat {
00228 public:
00238 SimpleDateFormat(UErrorCode& status);
00239
00251 SimpleDateFormat(const UnicodeString& pattern,
00252 UErrorCode& status);
00253
00275 SimpleDateFormat(const UnicodeString& pattern,
00276 const UnicodeString& override,
00277 UErrorCode& status);
00278
00291 SimpleDateFormat(const UnicodeString& pattern,
00292 const Locale& locale,
00293 UErrorCode& status);
00294
00316 SimpleDateFormat(const UnicodeString& pattern,
00317 const UnicodeString& override,
00318 const Locale& locale,
00319 UErrorCode& status);
00320
00330 SimpleDateFormat(const UnicodeString& pattern,
00331 DateFormatSymbols* formatDataToAdopt,
00332 UErrorCode& status);
00333
00343 SimpleDateFormat(const UnicodeString& pattern,
00344 const DateFormatSymbols& formatData,
00345 UErrorCode& status);
00346
00351 SimpleDateFormat(const SimpleDateFormat&);
00352
00357 SimpleDateFormat& operator=(const SimpleDateFormat&);
00358
00363 virtual ~SimpleDateFormat();
00364
00371 virtual Format* clone(void) const;
00372
00380 virtual UBool operator==(const Format& other) const;
00381
00382
00383 using DateFormat::format;
00384
00401 virtual UnicodeString& format( Calendar& cal,
00402 UnicodeString& appendTo,
00403 FieldPosition& pos) const;
00404
00423 virtual UnicodeString& format( Calendar& cal,
00424 UnicodeString& appendTo,
00425 FieldPositionIterator* posIter,
00426 UErrorCode& status) const;
00427
00447 virtual UnicodeString& format( const Formattable& obj,
00448 UnicodeString& appendTo,
00449 FieldPosition& pos,
00450 UErrorCode& status) const;
00451
00472 virtual UnicodeString& format( const Formattable& obj,
00473 UnicodeString& appendTo,
00474 FieldPositionIterator* posIter,
00475 UErrorCode& status) const;
00476
00487 UnicodeString& format(UDate date,
00488 UnicodeString& appendTo,
00489 FieldPosition& fieldPosition) const;
00490
00503 UnicodeString& format(UDate date,
00504 UnicodeString& appendTo,
00505 FieldPositionIterator* posIter,
00506 UErrorCode& status) const;
00507
00517 UnicodeString& format(const Formattable& obj,
00518 UnicodeString& appendTo,
00519 UErrorCode& status) const;
00520
00529 UnicodeString& format(UDate date, UnicodeString& appendTo) const;
00530
00557 virtual void parse( const UnicodeString& text,
00558 Calendar& cal,
00559 ParsePosition& pos) const;
00560
00591 UDate parse( const UnicodeString& text,
00592 ParsePosition& pos) const;
00593
00594
00628 virtual UDate parse( const UnicodeString& text,
00629 UErrorCode& status) const;
00630
00647 virtual void set2DigitYearStart(UDate d, UErrorCode& status);
00648
00664 UDate get2DigitYearStart(UErrorCode& status) const;
00665
00672 virtual UnicodeString& toPattern(UnicodeString& result) const;
00673
00690 virtual UnicodeString& toLocalizedPattern(UnicodeString& result,
00691 UErrorCode& status) const;
00692
00701 virtual void applyPattern(const UnicodeString& pattern);
00702
00713 virtual void applyLocalizedPattern(const UnicodeString& pattern,
00714 UErrorCode& status);
00715
00724 virtual const DateFormatSymbols* getDateFormatSymbols(void) const;
00725
00732 virtual void adoptDateFormatSymbols(DateFormatSymbols* newFormatSymbols);
00733
00739 virtual void setDateFormatSymbols(const DateFormatSymbols& newFormatSymbols);
00740
00752 static UClassID U_EXPORT2 getStaticClassID(void);
00753
00765 virtual UClassID getDynamicClassID(void) const;
00766
00776 virtual void adoptCalendar(Calendar* calendarToAdopt);
00777
00778
00788 virtual void setContext(UDisplayContext value, UErrorCode& status);
00789
00790
00801 virtual UDisplayContext getContext(UDisplayContextType type, UErrorCode& status) const;
00802
00803
00811 virtual void adoptTimeZoneFormat(TimeZoneFormat* timeZoneFormatToAdopt);
00812
00818 virtual void setTimeZoneFormat(const TimeZoneFormat& newTimeZoneFormat);
00819
00825 virtual const TimeZoneFormat* getTimeZoneFormat(void) const;
00826
00827 #ifndef U_HIDE_INTERNAL_API
00828
00838 UBool isFieldUnitIgnored(UCalendarDateFields field) const;
00839
00840
00852 static UBool isFieldUnitIgnored(const UnicodeString& pattern,
00853 UCalendarDateFields field);
00854
00863 const Locale& getSmpFmtLocale(void) const;
00864 #endif
00865
00866 private:
00867 friend class DateFormat;
00868
00869 void initializeDefaultCentury(void);
00870
00871 SimpleDateFormat();
00872
00881 SimpleDateFormat(EStyle timeStyle, EStyle dateStyle, const Locale& locale, UErrorCode& status);
00882
00891 SimpleDateFormat(const Locale& locale, UErrorCode& status);
00892
00896 UnicodeString& _format(Calendar& cal, UnicodeString& appendTo, FieldPositionHandler& handler, UErrorCode& status) const;
00897
00914 void subFormat(UnicodeString &appendTo,
00915 UChar ch,
00916 int32_t count,
00917 UDisplayContext capitalizationContext,
00918 int32_t fieldNum,
00919 FieldPositionHandler& handler,
00920 Calendar& cal,
00921 UErrorCode& status) const;
00922
00936 void zeroPaddingNumber(NumberFormat *currentNumberFormat,
00937 UnicodeString &appendTo,
00938 int32_t value,
00939 int32_t minDigits,
00940 int32_t maxDigits) const;
00941
00946 static UBool isNumeric(UChar formatChar, int32_t count);
00947
00951 static UBool isAtNumericField(const UnicodeString &pattern, int32_t patternOffset);
00952
00956 static UBool isAfterNonNumericField(const UnicodeString &pattern, int32_t patternOffset);
00957
00965 Calendar *initializeCalendar(TimeZone* adoptZone, const Locale& locale, UErrorCode& status);
00966
00973 void initializeSymbols(const Locale& locale, Calendar* calendar, UErrorCode& status);
00974
00984 void construct(EStyle timeStyle, EStyle dateStyle, const Locale& locale, UErrorCode& status);
00985
00992 void initialize(const Locale& locale, UErrorCode& status);
00993
01007 int32_t matchString(const UnicodeString& text, int32_t start, UCalendarDateFields field,
01008 const UnicodeString* stringArray, int32_t stringArrayCount,
01009 const UnicodeString* monthPattern, Calendar& cal) const;
01010
01023 int32_t matchQuarterString(const UnicodeString& text, int32_t start, UCalendarDateFields field,
01024 const UnicodeString* stringArray, int32_t stringArrayCount, Calendar& cal) const;
01025
01039 static UBool matchLiterals(const UnicodeString &pattern, int32_t &patternOffset,
01040 const UnicodeString &text, int32_t &textOffset, UBool lenient);
01041
01060 int32_t subParse(const UnicodeString& text, int32_t& start, UChar ch, int32_t count,
01061 UBool obeyCount, UBool allowNegative, UBool ambiguousYear[], int32_t& saveHebrewMonth, Calendar& cal,
01062 int32_t patLoc, MessageFormat * numericLeapMonthFormatter) const;
01063
01064 void parseInt(const UnicodeString& text,
01065 Formattable& number,
01066 ParsePosition& pos,
01067 UBool allowNegative,
01068 NumberFormat *fmt) const;
01069
01070 void parseInt(const UnicodeString& text,
01071 Formattable& number,
01072 int32_t maxDigits,
01073 ParsePosition& pos,
01074 UBool allowNegative,
01075 NumberFormat *fmt) const;
01076
01077 int32_t checkIntSuffix(const UnicodeString& text, int32_t start,
01078 int32_t patLoc, UBool isNegative) const;
01079
01092 static void translatePattern(const UnicodeString& originalPattern,
01093 UnicodeString& translatedPattern,
01094 const UnicodeString& from,
01095 const UnicodeString& to,
01096 UErrorCode& status);
01097
01105 void parseAmbiguousDatesAsAfter(UDate startDate, UErrorCode& status);
01106
01116 int32_t compareSimpleAffix(const UnicodeString& affix,
01117 const UnicodeString& input,
01118 int32_t pos) const;
01119
01124 int32_t skipPatternWhiteSpace(const UnicodeString& text, int32_t pos) const;
01125
01130 int32_t skipUWhiteSpace(const UnicodeString& text, int32_t pos) const;
01131
01135 void initNumberFormatters(const Locale &locale,UErrorCode &status);
01136
01140 NumberFormat * getNumberFormatByIndex(UDateFormatField index) const;
01141
01145 void processOverrideString(const Locale &locale, const UnicodeString &str, int8_t type, UErrorCode &status);
01146
01150 static const UCalendarDateFields fgPatternIndexToCalendarField[];
01151
01155 static const UDateFormatField fgPatternIndexToDateFormatField[];
01156
01160 TimeZoneFormat *tzFormat() const;
01161
01168 static const int32_t fgCalendarFieldToLevel[];
01169 static const int32_t fgPatternCharToLevel[];
01170
01174 UnicodeString fPattern;
01175
01179 UnicodeString fDateOverride;
01180
01184 UnicodeString fTimeOverride;
01185
01186
01190 Locale fLocale;
01191
01196 DateFormatSymbols* fSymbols;
01197
01201 TimeZoneFormat* fTimeZoneFormat;
01202
01211 UDate fDefaultCenturyStart;
01212
01216 int32_t fDefaultCenturyStartYear;
01217
01218 int32_t tztype;
01219
01220 typedef struct NSOverride {
01221 NumberFormat *nf;
01222 int32_t hash;
01223 NSOverride *next;
01224 } NSOverride;
01225
01226 NumberFormat **fNumberFormatters;
01227
01228 NSOverride *fOverrideList;
01229
01230 UBool fHaveDefaultCentury;
01231
01232 UDisplayContext fCapitalizationContext;
01233 };
01234
01235 inline UDate
01236 SimpleDateFormat::get2DigitYearStart(UErrorCode& ) const
01237 {
01238 return fDefaultCenturyStart;
01239 }
01240
01241 inline UnicodeString&
01242 SimpleDateFormat::format(const Formattable& obj,
01243 UnicodeString& appendTo,
01244 UErrorCode& status) const {
01245
01246
01247 return DateFormat::format(obj, appendTo, status);
01248 }
01249
01250 inline UnicodeString&
01251 SimpleDateFormat::format(const Formattable& obj,
01252 UnicodeString& appendTo,
01253 FieldPosition& pos,
01254 UErrorCode& status) const
01255 {
01256
01257
01258 return DateFormat::format(obj, appendTo, pos, status);
01259 }
01260
01261 inline UnicodeString&
01262 SimpleDateFormat::format(const Formattable& obj,
01263 UnicodeString& appendTo,
01264 FieldPositionIterator* posIter,
01265 UErrorCode& status) const
01266 {
01267
01268
01269 return DateFormat::format(obj, appendTo, posIter, status);
01270 }
01271
01272 inline UnicodeString&
01273 SimpleDateFormat::format(UDate date,
01274 UnicodeString& appendTo,
01275 FieldPosition& fieldPosition) const {
01276
01277
01278 return DateFormat::format(date, appendTo, fieldPosition);
01279 }
01280
01281 inline UnicodeString&
01282 SimpleDateFormat::format(UDate date,
01283 UnicodeString& appendTo,
01284 FieldPositionIterator* posIter,
01285 UErrorCode& status) const {
01286
01287
01288 return DateFormat::format(date, appendTo, posIter, status);
01289 }
01290
01291 inline UnicodeString&
01292 SimpleDateFormat::format(UDate date, UnicodeString& appendTo) const {
01293 return DateFormat::format(date, appendTo);
01294 }
01295
01296 U_NAMESPACE_END
01297
01298 #endif
01299
01300 #endif // _SMPDTFMT
01301