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 #include "unicode/tzfmt.h"
00039 #include "unicode/brkiter.h"
00040
00041 U_NAMESPACE_BEGIN
00042
00043 class DateFormatSymbols;
00044 class DateFormat;
00045 class MessageFormat;
00046 class FieldPositionHandler;
00047 class TimeZoneFormat;
00048 class SharedNumberFormat;
00049 class SimpleDateFormatMutableNFs;
00050
00717 class U_I18N_API SimpleDateFormat: public DateFormat {
00718 public:
00728 SimpleDateFormat(UErrorCode& status);
00729
00741 SimpleDateFormat(const UnicodeString& pattern,
00742 UErrorCode& status);
00743
00765 SimpleDateFormat(const UnicodeString& pattern,
00766 const UnicodeString& override,
00767 UErrorCode& status);
00768
00781 SimpleDateFormat(const UnicodeString& pattern,
00782 const Locale& locale,
00783 UErrorCode& status);
00784
00806 SimpleDateFormat(const UnicodeString& pattern,
00807 const UnicodeString& override,
00808 const Locale& locale,
00809 UErrorCode& status);
00810
00820 SimpleDateFormat(const UnicodeString& pattern,
00821 DateFormatSymbols* formatDataToAdopt,
00822 UErrorCode& status);
00823
00833 SimpleDateFormat(const UnicodeString& pattern,
00834 const DateFormatSymbols& formatData,
00835 UErrorCode& status);
00836
00841 SimpleDateFormat(const SimpleDateFormat&);
00842
00847 SimpleDateFormat& operator=(const SimpleDateFormat&);
00848
00853 virtual ~SimpleDateFormat();
00854
00861 virtual Format* clone(void) const;
00862
00870 virtual UBool operator==(const Format& other) const;
00871
00872
00873 using DateFormat::format;
00874
00891 virtual UnicodeString& format( Calendar& cal,
00892 UnicodeString& appendTo,
00893 FieldPosition& pos) const;
00894
00913 virtual UnicodeString& format( Calendar& cal,
00914 UnicodeString& appendTo,
00915 FieldPositionIterator* posIter,
00916 UErrorCode& status) const;
00917
00918 using DateFormat::parse;
00919
00946 virtual void parse( const UnicodeString& text,
00947 Calendar& cal,
00948 ParsePosition& pos) const;
00949
00950
00967 virtual void set2DigitYearStart(UDate d, UErrorCode& status);
00968
00984 UDate get2DigitYearStart(UErrorCode& status) const;
00985
00992 virtual UnicodeString& toPattern(UnicodeString& result) const;
00993
01010 virtual UnicodeString& toLocalizedPattern(UnicodeString& result,
01011 UErrorCode& status) const;
01012
01021 virtual void applyPattern(const UnicodeString& pattern);
01022
01033 virtual void applyLocalizedPattern(const UnicodeString& pattern,
01034 UErrorCode& status);
01035
01044 virtual const DateFormatSymbols* getDateFormatSymbols(void) const;
01045
01052 virtual void adoptDateFormatSymbols(DateFormatSymbols* newFormatSymbols);
01053
01059 virtual void setDateFormatSymbols(const DateFormatSymbols& newFormatSymbols);
01060
01072 static UClassID U_EXPORT2 getStaticClassID(void);
01073
01085 virtual UClassID getDynamicClassID(void) const;
01086
01096 virtual void adoptCalendar(Calendar* calendarToAdopt);
01097
01098
01106 virtual void adoptTimeZoneFormat(TimeZoneFormat* timeZoneFormatToAdopt);
01107
01113 virtual void setTimeZoneFormat(const TimeZoneFormat& newTimeZoneFormat);
01114
01120 virtual const TimeZoneFormat* getTimeZoneFormat(void) const;
01121
01132 virtual void setContext(UDisplayContext value, UErrorCode& status);
01133
01141 void adoptNumberFormat(NumberFormat *formatToAdopt);
01142
01158 void adoptNumberFormat(const UnicodeString& fields, NumberFormat *formatToAdopt, UErrorCode &status);
01159
01165 const NumberFormat * getNumberFormatForField(UChar field) const;
01166
01167 #ifndef U_HIDE_INTERNAL_API
01168
01178 UBool isFieldUnitIgnored(UCalendarDateFields field) const;
01179
01180
01192 static UBool isFieldUnitIgnored(const UnicodeString& pattern,
01193 UCalendarDateFields field);
01194
01203 const Locale& getSmpFmtLocale(void) const;
01204 #endif
01205
01206 private:
01207 friend class DateFormat;
01208
01209 void initializeDefaultCentury(void);
01210
01211 void initializeBooleanAttributes(void);
01212
01213 SimpleDateFormat();
01214
01223 SimpleDateFormat(EStyle timeStyle, EStyle dateStyle, const Locale& locale, UErrorCode& status);
01224
01233 SimpleDateFormat(const Locale& locale, UErrorCode& status);
01234
01238 UnicodeString& _format(Calendar& cal, UnicodeString& appendTo, FieldPositionHandler& handler, UErrorCode& status) const;
01239
01256 void subFormat(UnicodeString &appendTo,
01257 UChar ch,
01258 int32_t count,
01259 UDisplayContext capitalizationContext,
01260 int32_t fieldNum,
01261 FieldPositionHandler& handler,
01262 Calendar& cal,
01263 SimpleDateFormatMutableNFs &mutableNFs,
01264 UErrorCode& status) const;
01265
01279 void zeroPaddingNumber(NumberFormat *currentNumberFormat,
01280 UnicodeString &appendTo,
01281 int32_t value,
01282 int32_t minDigits,
01283 int32_t maxDigits) const;
01284
01289 static UBool isNumeric(UChar formatChar, int32_t count);
01290
01294 static UBool isAtNumericField(const UnicodeString &pattern, int32_t patternOffset);
01295
01299 static UBool isAfterNonNumericField(const UnicodeString &pattern, int32_t patternOffset);
01300
01308 Calendar *initializeCalendar(TimeZone* adoptZone, const Locale& locale, UErrorCode& status);
01309
01319 void construct(EStyle timeStyle, EStyle dateStyle, const Locale& locale, UErrorCode& status);
01320
01327 void initialize(const Locale& locale, UErrorCode& status);
01328
01342 int32_t matchString(const UnicodeString& text, int32_t start, UCalendarDateFields field,
01343 const UnicodeString* stringArray, int32_t stringArrayCount,
01344 const UnicodeString* monthPattern, Calendar& cal) const;
01345
01358 int32_t matchQuarterString(const UnicodeString& text, int32_t start, UCalendarDateFields field,
01359 const UnicodeString* stringArray, int32_t stringArrayCount, Calendar& cal) const;
01360
01364 int32_t matchDayPeriodStrings(const UnicodeString& text, int32_t start,
01365 const UnicodeString* stringArray, int32_t stringArrayCount,
01366 int32_t &dayPeriod) const;
01367
01383 static UBool matchLiterals(const UnicodeString &pattern, int32_t &patternOffset,
01384 const UnicodeString &text, int32_t &textOffset,
01385 UBool whitespaceLenient, UBool partialMatchLenient, UBool oldLeniency);
01386
01407 int32_t subParse(const UnicodeString& text, int32_t& start, UChar ch, int32_t count,
01408 UBool obeyCount, UBool allowNegative, UBool ambiguousYear[], int32_t& saveHebrewMonth, Calendar& cal,
01409 int32_t patLoc, MessageFormat * numericLeapMonthFormatter, UTimeZoneFormatTimeType *tzTimeType, SimpleDateFormatMutableNFs &mutableNFs,
01410 int32_t *dayPeriod=NULL) const;
01411
01412 void parseInt(const UnicodeString& text,
01413 Formattable& number,
01414 ParsePosition& pos,
01415 UBool allowNegative,
01416 NumberFormat *fmt) const;
01417
01418 void parseInt(const UnicodeString& text,
01419 Formattable& number,
01420 int32_t maxDigits,
01421 ParsePosition& pos,
01422 UBool allowNegative,
01423 NumberFormat *fmt) const;
01424
01425 int32_t checkIntSuffix(const UnicodeString& text, int32_t start,
01426 int32_t patLoc, UBool isNegative) const;
01427
01440 static void translatePattern(const UnicodeString& originalPattern,
01441 UnicodeString& translatedPattern,
01442 const UnicodeString& from,
01443 const UnicodeString& to,
01444 UErrorCode& status);
01445
01453 void parseAmbiguousDatesAsAfter(UDate startDate, UErrorCode& status);
01454
01464 int32_t compareSimpleAffix(const UnicodeString& affix,
01465 const UnicodeString& input,
01466 int32_t pos) const;
01467
01472 int32_t skipPatternWhiteSpace(const UnicodeString& text, int32_t pos) const;
01473
01478 int32_t skipUWhiteSpace(const UnicodeString& text, int32_t pos) const;
01479
01483 void initNumberFormatters(const Locale &locale,UErrorCode &status);
01484
01488 void processOverrideString(const Locale &locale, const UnicodeString &str, int8_t type, UErrorCode &status);
01489
01493 static const UCalendarDateFields fgPatternIndexToCalendarField[];
01494
01498 static const UDateFormatField fgPatternIndexToDateFormatField[];
01499
01503 TimeZoneFormat *tzFormat() const;
01504
01505 const NumberFormat* getNumberFormatByIndex(UDateFormatField index) const;
01506
01513 static const int32_t fgCalendarFieldToLevel[];
01514
01518 static int32_t getLevelFromChar(UChar ch);
01519
01523 static UBool isSyntaxChar(UChar ch);
01524
01528 UnicodeString fPattern;
01529
01533 UnicodeString fDateOverride;
01534
01538 UnicodeString fTimeOverride;
01539
01540
01544 Locale fLocale;
01545
01550 DateFormatSymbols* fSymbols;
01551
01555 TimeZoneFormat* fTimeZoneFormat;
01556
01565 UDate fDefaultCenturyStart;
01566
01567 UBool fHasMinute;
01568 UBool fHasSecond;
01569
01573 void parsePattern();
01574
01578 int32_t fDefaultCenturyStartYear;
01579
01580 struct NSOverride : public UMemory {
01581 const SharedNumberFormat *snf;
01582 int32_t hash;
01583 NSOverride *next;
01584 void free();
01585 NSOverride() : snf(NULL), hash(0), next(NULL) {
01586 }
01587 ~NSOverride();
01588 };
01589
01594 const SharedNumberFormat **fSharedNumberFormatters;
01595
01596 UBool fHaveDefaultCentury;
01597
01598 BreakIterator* fCapitalizationBrkIter;
01599 };
01600
01601 inline UDate
01602 SimpleDateFormat::get2DigitYearStart(UErrorCode& ) const
01603 {
01604 return fDefaultCenturyStart;
01605 }
01606
01607 U_NAMESPACE_END
01608
01609 #endif
01610
01611 #endif // _SMPDTFMT
01612