00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef SMPDTFMT_H
00027 #define SMPDTFMT_H
00028
00029 #include "unicode/utypes.h"
00030
00036 #if !UCONFIG_NO_FORMATTING
00037
00038 #include "unicode/datefmt.h"
00039 #include "unicode/udisplaycontext.h"
00040 #include "unicode/tzfmt.h"
00041 #include "unicode/brkiter.h"
00042
00043 U_NAMESPACE_BEGIN
00044
00045 class DateFormatSymbols;
00046 class DateFormat;
00047 class MessageFormat;
00048 class FieldPositionHandler;
00049 class TimeZoneFormat;
00050 class SharedNumberFormat;
00051 class SimpleDateFormatMutableNFs;
00052
00719 class U_I18N_API SimpleDateFormat: public DateFormat {
00720 public:
00730 SimpleDateFormat(UErrorCode& status);
00731
00743 SimpleDateFormat(const UnicodeString& pattern,
00744 UErrorCode& status);
00745
00767 SimpleDateFormat(const UnicodeString& pattern,
00768 const UnicodeString& override,
00769 UErrorCode& status);
00770
00783 SimpleDateFormat(const UnicodeString& pattern,
00784 const Locale& locale,
00785 UErrorCode& status);
00786
00808 SimpleDateFormat(const UnicodeString& pattern,
00809 const UnicodeString& override,
00810 const Locale& locale,
00811 UErrorCode& status);
00812
00822 SimpleDateFormat(const UnicodeString& pattern,
00823 DateFormatSymbols* formatDataToAdopt,
00824 UErrorCode& status);
00825
00835 SimpleDateFormat(const UnicodeString& pattern,
00836 const DateFormatSymbols& formatData,
00837 UErrorCode& status);
00838
00843 SimpleDateFormat(const SimpleDateFormat&);
00844
00849 SimpleDateFormat& operator=(const SimpleDateFormat&);
00850
00855 virtual ~SimpleDateFormat();
00856
00863 virtual Format* clone(void) const;
00864
00872 virtual UBool operator==(const Format& other) const;
00873
00874
00875 using DateFormat::format;
00876
00893 virtual UnicodeString& format( Calendar& cal,
00894 UnicodeString& appendTo,
00895 FieldPosition& pos) const;
00896
00915 virtual UnicodeString& format( Calendar& cal,
00916 UnicodeString& appendTo,
00917 FieldPositionIterator* posIter,
00918 UErrorCode& status) const;
00919
00920 using DateFormat::parse;
00921
00948 virtual void parse( const UnicodeString& text,
00949 Calendar& cal,
00950 ParsePosition& pos) const;
00951
00952
00969 virtual void set2DigitYearStart(UDate d, UErrorCode& status);
00970
00986 UDate get2DigitYearStart(UErrorCode& status) const;
00987
00994 virtual UnicodeString& toPattern(UnicodeString& result) const;
00995
01018 virtual UnicodeString& toLocalizedPattern(UnicodeString& result,
01019 UErrorCode& status) const;
01020
01029 virtual void applyPattern(const UnicodeString& pattern);
01030
01041 virtual void applyLocalizedPattern(const UnicodeString& pattern,
01042 UErrorCode& status);
01043
01052 virtual const DateFormatSymbols* getDateFormatSymbols(void) const;
01053
01060 virtual void adoptDateFormatSymbols(DateFormatSymbols* newFormatSymbols);
01061
01067 virtual void setDateFormatSymbols(const DateFormatSymbols& newFormatSymbols);
01068
01080 static UClassID U_EXPORT2 getStaticClassID(void);
01081
01093 virtual UClassID getDynamicClassID(void) const;
01094
01104 virtual void adoptCalendar(Calendar* calendarToAdopt);
01105
01106
01114 virtual void adoptTimeZoneFormat(TimeZoneFormat* timeZoneFormatToAdopt);
01115
01121 virtual void setTimeZoneFormat(const TimeZoneFormat& newTimeZoneFormat);
01122
01128 virtual const TimeZoneFormat* getTimeZoneFormat(void) const;
01129
01140 virtual void setContext(UDisplayContext value, UErrorCode& status);
01141
01149 void adoptNumberFormat(NumberFormat *formatToAdopt);
01150
01166 void adoptNumberFormat(const UnicodeString& fields, NumberFormat *formatToAdopt, UErrorCode &status);
01167
01173 const NumberFormat * getNumberFormatForField(char16_t field) const;
01174
01175 #ifndef U_HIDE_INTERNAL_API
01176
01186 UBool isFieldUnitIgnored(UCalendarDateFields field) const;
01187
01188
01200 static UBool isFieldUnitIgnored(const UnicodeString& pattern,
01201 UCalendarDateFields field);
01202
01211 const Locale& getSmpFmtLocale(void) const;
01212 #endif
01213
01214 private:
01215 friend class DateFormat;
01216
01217 void initializeDefaultCentury(void);
01218
01219 void initializeBooleanAttributes(void);
01220
01221 SimpleDateFormat();
01222
01231 SimpleDateFormat(EStyle timeStyle, EStyle dateStyle, const Locale& locale, UErrorCode& status);
01232
01241 SimpleDateFormat(const Locale& locale, UErrorCode& status);
01242
01246 UnicodeString& _format(Calendar& cal, UnicodeString& appendTo, FieldPositionHandler& handler, UErrorCode& status) const;
01247
01264 void subFormat(UnicodeString &appendTo,
01265 char16_t ch,
01266 int32_t count,
01267 UDisplayContext capitalizationContext,
01268 int32_t fieldNum,
01269 FieldPositionHandler& handler,
01270 Calendar& cal,
01271 SimpleDateFormatMutableNFs &mutableNFs,
01272 UErrorCode& status) const;
01273
01287 void zeroPaddingNumber(NumberFormat *currentNumberFormat,
01288 UnicodeString &appendTo,
01289 int32_t value,
01290 int32_t minDigits,
01291 int32_t maxDigits) const;
01292
01297 static UBool isNumeric(char16_t formatChar, int32_t count);
01298
01302 static UBool isAtNumericField(const UnicodeString &pattern, int32_t patternOffset);
01303
01307 static UBool isAfterNonNumericField(const UnicodeString &pattern, int32_t patternOffset);
01308
01316 Calendar *initializeCalendar(TimeZone* adoptZone, const Locale& locale, UErrorCode& status);
01317
01327 void construct(EStyle timeStyle, EStyle dateStyle, const Locale& locale, UErrorCode& status);
01328
01335 void initialize(const Locale& locale, UErrorCode& status);
01336
01350 int32_t matchString(const UnicodeString& text, int32_t start, UCalendarDateFields field,
01351 const UnicodeString* stringArray, int32_t stringArrayCount,
01352 const UnicodeString* monthPattern, Calendar& cal) const;
01353
01366 int32_t matchQuarterString(const UnicodeString& text, int32_t start, UCalendarDateFields field,
01367 const UnicodeString* stringArray, int32_t stringArrayCount, Calendar& cal) const;
01368
01372 int32_t matchDayPeriodStrings(const UnicodeString& text, int32_t start,
01373 const UnicodeString* stringArray, int32_t stringArrayCount,
01374 int32_t &dayPeriod) const;
01375
01391 static UBool matchLiterals(const UnicodeString &pattern, int32_t &patternOffset,
01392 const UnicodeString &text, int32_t &textOffset,
01393 UBool whitespaceLenient, UBool partialMatchLenient, UBool oldLeniency);
01394
01415 int32_t subParse(const UnicodeString& text, int32_t& start, char16_t ch, int32_t count,
01416 UBool obeyCount, UBool allowNegative, UBool ambiguousYear[], int32_t& saveHebrewMonth, Calendar& cal,
01417 int32_t patLoc, MessageFormat * numericLeapMonthFormatter, UTimeZoneFormatTimeType *tzTimeType, SimpleDateFormatMutableNFs &mutableNFs,
01418 int32_t *dayPeriod=NULL) const;
01419
01420 void parseInt(const UnicodeString& text,
01421 Formattable& number,
01422 ParsePosition& pos,
01423 UBool allowNegative,
01424 NumberFormat *fmt) const;
01425
01426 void parseInt(const UnicodeString& text,
01427 Formattable& number,
01428 int32_t maxDigits,
01429 ParsePosition& pos,
01430 UBool allowNegative,
01431 NumberFormat *fmt) const;
01432
01433 int32_t checkIntSuffix(const UnicodeString& text, int32_t start,
01434 int32_t patLoc, UBool isNegative) const;
01435
01444 int32_t countDigits(const UnicodeString& text, int32_t start, int32_t end) const;
01445
01458 static void translatePattern(const UnicodeString& originalPattern,
01459 UnicodeString& translatedPattern,
01460 const UnicodeString& from,
01461 const UnicodeString& to,
01462 UErrorCode& status);
01463
01471 void parseAmbiguousDatesAsAfter(UDate startDate, UErrorCode& status);
01472
01482 int32_t compareSimpleAffix(const UnicodeString& affix,
01483 const UnicodeString& input,
01484 int32_t pos) const;
01485
01490 int32_t skipPatternWhiteSpace(const UnicodeString& text, int32_t pos) const;
01491
01496 int32_t skipUWhiteSpace(const UnicodeString& text, int32_t pos) const;
01497
01501 void initNumberFormatters(const Locale &locale,UErrorCode &status);
01502
01506 void processOverrideString(const Locale &locale, const UnicodeString &str, int8_t type, UErrorCode &status);
01507
01511 static const UCalendarDateFields fgPatternIndexToCalendarField[];
01512
01516 static const UDateFormatField fgPatternIndexToDateFormatField[];
01517
01521 TimeZoneFormat *tzFormat() const;
01522
01523 const NumberFormat* getNumberFormatByIndex(UDateFormatField index) const;
01524
01531 static const int32_t fgCalendarFieldToLevel[];
01532
01536 static int32_t getLevelFromChar(char16_t ch);
01537
01541 static UBool isSyntaxChar(char16_t ch);
01542
01546 UnicodeString fPattern;
01547
01551 UnicodeString fDateOverride;
01552
01556 UnicodeString fTimeOverride;
01557
01558
01562 Locale fLocale;
01563
01568 DateFormatSymbols* fSymbols;
01569
01573 TimeZoneFormat* fTimeZoneFormat;
01574
01583 UDate fDefaultCenturyStart;
01584
01585 UBool fHasMinute;
01586 UBool fHasSecond;
01587
01591 void parsePattern();
01592
01596 int32_t fDefaultCenturyStartYear;
01597
01598 struct NSOverride : public UMemory {
01599 const SharedNumberFormat *snf;
01600 int32_t hash;
01601 NSOverride *next;
01602 void free();
01603 NSOverride() : snf(NULL), hash(0), next(NULL) {
01604 }
01605 ~NSOverride();
01606 };
01607
01612 const SharedNumberFormat **fSharedNumberFormatters;
01613
01614 UBool fHaveDefaultCentury;
01615
01616 BreakIterator* fCapitalizationBrkIter;
01617 };
01618
01619 inline UDate
01620 SimpleDateFormat::get2DigitYearStart(UErrorCode& ) const
01621 {
01622 return fDefaultCenturyStart;
01623 }
01624
01625 U_NAMESPACE_END
01626
01627 #endif
01628
01629 #endif // _SMPDTFMT
01630