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
00031 #if U_SHOW_CPLUSPLUS_API
00032
00038 #if !UCONFIG_NO_FORMATTING
00039
00040 #include "unicode/datefmt.h"
00041 #include "unicode/udisplaycontext.h"
00042 #include "unicode/tzfmt.h"
00043 #include "unicode/brkiter.h"
00044
00045 U_NAMESPACE_BEGIN
00046
00047 class DateFormatSymbols;
00048 class DateFormat;
00049 class MessageFormat;
00050 class FieldPositionHandler;
00051 class TimeZoneFormat;
00052 class SharedNumberFormat;
00053 class SimpleDateFormatMutableNFs;
00054 class DateIntervalFormat;
00055
00056 namespace number {
00057 class LocalizedNumberFormatter;
00058 }
00059
00726 class U_I18N_API SimpleDateFormat: public DateFormat {
00727 public:
00737 SimpleDateFormat(UErrorCode& status);
00738
00750 SimpleDateFormat(const UnicodeString& pattern,
00751 UErrorCode& status);
00752
00774 SimpleDateFormat(const UnicodeString& pattern,
00775 const UnicodeString& override,
00776 UErrorCode& status);
00777
00790 SimpleDateFormat(const UnicodeString& pattern,
00791 const Locale& locale,
00792 UErrorCode& status);
00793
00815 SimpleDateFormat(const UnicodeString& pattern,
00816 const UnicodeString& override,
00817 const Locale& locale,
00818 UErrorCode& status);
00819
00829 SimpleDateFormat(const UnicodeString& pattern,
00830 DateFormatSymbols* formatDataToAdopt,
00831 UErrorCode& status);
00832
00842 SimpleDateFormat(const UnicodeString& pattern,
00843 const DateFormatSymbols& formatData,
00844 UErrorCode& status);
00845
00850 SimpleDateFormat(const SimpleDateFormat&);
00851
00856 SimpleDateFormat& operator=(const SimpleDateFormat&);
00857
00862 virtual ~SimpleDateFormat();
00863
00870 virtual SimpleDateFormat* clone() const;
00871
00879 virtual UBool operator==(const Format& other) const;
00880
00881
00882 using DateFormat::format;
00883
00900 virtual UnicodeString& format( Calendar& cal,
00901 UnicodeString& appendTo,
00902 FieldPosition& pos) const;
00903
00922 virtual UnicodeString& format( Calendar& cal,
00923 UnicodeString& appendTo,
00924 FieldPositionIterator* posIter,
00925 UErrorCode& status) const;
00926
00927 using DateFormat::parse;
00928
00955 virtual void parse( const UnicodeString& text,
00956 Calendar& cal,
00957 ParsePosition& pos) const;
00958
00959
00976 virtual void set2DigitYearStart(UDate d, UErrorCode& status);
00977
00993 UDate get2DigitYearStart(UErrorCode& status) const;
00994
01001 virtual UnicodeString& toPattern(UnicodeString& result) const;
01002
01025 virtual UnicodeString& toLocalizedPattern(UnicodeString& result,
01026 UErrorCode& status) const;
01027
01036 virtual void applyPattern(const UnicodeString& pattern);
01037
01048 virtual void applyLocalizedPattern(const UnicodeString& pattern,
01049 UErrorCode& status);
01050
01059 virtual const DateFormatSymbols* getDateFormatSymbols(void) const;
01060
01067 virtual void adoptDateFormatSymbols(DateFormatSymbols* newFormatSymbols);
01068
01074 virtual void setDateFormatSymbols(const DateFormatSymbols& newFormatSymbols);
01075
01087 static UClassID U_EXPORT2 getStaticClassID(void);
01088
01100 virtual UClassID getDynamicClassID(void) const;
01101
01111 virtual void adoptCalendar(Calendar* calendarToAdopt);
01112
01113
01121 virtual void adoptTimeZoneFormat(TimeZoneFormat* timeZoneFormatToAdopt);
01122
01128 virtual void setTimeZoneFormat(const TimeZoneFormat& newTimeZoneFormat);
01129
01135 virtual const TimeZoneFormat* getTimeZoneFormat(void) const;
01136
01147 virtual void setContext(UDisplayContext value, UErrorCode& status);
01148
01156 void adoptNumberFormat(NumberFormat *formatToAdopt);
01157
01173 void adoptNumberFormat(const UnicodeString& fields, NumberFormat *formatToAdopt, UErrorCode &status);
01174
01180 const NumberFormat * getNumberFormatForField(char16_t field) const;
01181
01182 #ifndef U_HIDE_INTERNAL_API
01183
01193 UBool isFieldUnitIgnored(UCalendarDateFields field) const;
01194
01195
01207 static UBool isFieldUnitIgnored(const UnicodeString& pattern,
01208 UCalendarDateFields field);
01209
01218 const Locale& getSmpFmtLocale(void) const;
01219 #endif
01220
01221 private:
01222 friend class DateFormat;
01223 friend class DateIntervalFormat;
01224
01225 void initializeDefaultCentury(void);
01226
01227 void initializeBooleanAttributes(void);
01228
01229 SimpleDateFormat();
01230
01239 SimpleDateFormat(EStyle timeStyle, EStyle dateStyle, const Locale& locale, UErrorCode& status);
01240
01249 SimpleDateFormat(const Locale& locale, UErrorCode& status);
01250
01254 UnicodeString& _format(Calendar& cal, UnicodeString& appendTo, FieldPositionHandler& handler, UErrorCode& status) const;
01255
01272 void subFormat(UnicodeString &appendTo,
01273 char16_t ch,
01274 int32_t count,
01275 UDisplayContext capitalizationContext,
01276 int32_t fieldNum,
01277 FieldPositionHandler& handler,
01278 Calendar& cal,
01279 UErrorCode& status) const;
01280
01294 void zeroPaddingNumber(const NumberFormat *currentNumberFormat,
01295 UnicodeString &appendTo,
01296 int32_t value,
01297 int32_t minDigits,
01298 int32_t maxDigits) const;
01299
01304 static UBool isNumeric(char16_t formatChar, int32_t count);
01305
01309 static UBool isAtNumericField(const UnicodeString &pattern, int32_t patternOffset);
01310
01314 static UBool isAfterNonNumericField(const UnicodeString &pattern, int32_t patternOffset);
01315
01323 Calendar *initializeCalendar(TimeZone* adoptZone, const Locale& locale, UErrorCode& status);
01324
01334 void construct(EStyle timeStyle, EStyle dateStyle, const Locale& locale, UErrorCode& status);
01335
01342 void initialize(const Locale& locale, UErrorCode& status);
01343
01357 int32_t matchString(const UnicodeString& text, int32_t start, UCalendarDateFields field,
01358 const UnicodeString* stringArray, int32_t stringArrayCount,
01359 const UnicodeString* monthPattern, Calendar& cal) const;
01360
01373 int32_t matchQuarterString(const UnicodeString& text, int32_t start, UCalendarDateFields field,
01374 const UnicodeString* stringArray, int32_t stringArrayCount, Calendar& cal) const;
01375
01379 int32_t matchDayPeriodStrings(const UnicodeString& text, int32_t start,
01380 const UnicodeString* stringArray, int32_t stringArrayCount,
01381 int32_t &dayPeriod) const;
01382
01398 static UBool matchLiterals(const UnicodeString &pattern, int32_t &patternOffset,
01399 const UnicodeString &text, int32_t &textOffset,
01400 UBool whitespaceLenient, UBool partialMatchLenient, UBool oldLeniency);
01401
01422 int32_t subParse(const UnicodeString& text, int32_t& start, char16_t ch, int32_t count,
01423 UBool obeyCount, UBool allowNegative, UBool ambiguousYear[], int32_t& saveHebrewMonth, Calendar& cal,
01424 int32_t patLoc, MessageFormat * numericLeapMonthFormatter, UTimeZoneFormatTimeType *tzTimeType,
01425 int32_t *dayPeriod=NULL) const;
01426
01427 void parseInt(const UnicodeString& text,
01428 Formattable& number,
01429 ParsePosition& pos,
01430 UBool allowNegative,
01431 const NumberFormat *fmt) const;
01432
01433 void parseInt(const UnicodeString& text,
01434 Formattable& number,
01435 int32_t maxDigits,
01436 ParsePosition& pos,
01437 UBool allowNegative,
01438 const NumberFormat *fmt) const;
01439
01440 int32_t checkIntSuffix(const UnicodeString& text, int32_t start,
01441 int32_t patLoc, UBool isNegative) const;
01442
01451 int32_t countDigits(const UnicodeString& text, int32_t start, int32_t end) const;
01452
01465 static void translatePattern(const UnicodeString& originalPattern,
01466 UnicodeString& translatedPattern,
01467 const UnicodeString& from,
01468 const UnicodeString& to,
01469 UErrorCode& status);
01470
01478 void parseAmbiguousDatesAsAfter(UDate startDate, UErrorCode& status);
01479
01489 int32_t compareSimpleAffix(const UnicodeString& affix,
01490 const UnicodeString& input,
01491 int32_t pos) const;
01492
01497 int32_t skipPatternWhiteSpace(const UnicodeString& text, int32_t pos) const;
01498
01503 int32_t skipUWhiteSpace(const UnicodeString& text, int32_t pos) const;
01504
01508 void initFastNumberFormatters(UErrorCode& status);
01509
01513 void freeFastNumberFormatters();
01514
01518 void initNumberFormatters(const Locale &locale,UErrorCode &status);
01519
01523 void processOverrideString(const Locale &locale, const UnicodeString &str, int8_t type, UErrorCode &status);
01524
01528 static const UCalendarDateFields fgPatternIndexToCalendarField[];
01529
01533 static const UDateFormatField fgPatternIndexToDateFormatField[];
01534
01538 TimeZoneFormat *tzFormat(UErrorCode &status) const;
01539
01540 const NumberFormat* getNumberFormatByIndex(UDateFormatField index) const;
01541
01548 static const int32_t fgCalendarFieldToLevel[];
01549
01553 static int32_t getLevelFromChar(char16_t ch);
01554
01558 static UBool isSyntaxChar(char16_t ch);
01559
01563 UnicodeString fPattern;
01564
01568 UnicodeString fDateOverride;
01569
01573 UnicodeString fTimeOverride;
01574
01575
01579 Locale fLocale;
01580
01585 DateFormatSymbols* fSymbols;
01586
01590 TimeZoneFormat* fTimeZoneFormat;
01591
01600 UDate fDefaultCenturyStart;
01601
01602 UBool fHasMinute;
01603 UBool fHasSecond;
01604 UBool fHasHanYearChar;
01605
01609 void parsePattern();
01610
01614 int32_t fDefaultCenturyStartYear;
01615
01616 struct NSOverride : public UMemory {
01617 const SharedNumberFormat *snf;
01618 int32_t hash;
01619 NSOverride *next;
01620 void free();
01621 NSOverride() : snf(NULL), hash(0), next(NULL) {
01622 }
01623 ~NSOverride();
01624 };
01625
01630 const SharedNumberFormat **fSharedNumberFormatters;
01631
01632 enum NumberFormatterKey {
01633 SMPDTFMT_NF_1x10,
01634 SMPDTFMT_NF_2x10,
01635 SMPDTFMT_NF_3x10,
01636 SMPDTFMT_NF_4x10,
01637 SMPDTFMT_NF_2x2,
01638 SMPDTFMT_NF_COUNT
01639 };
01640
01644 const number::LocalizedNumberFormatter* fFastNumberFormatters[SMPDTFMT_NF_COUNT] = {};
01645
01646 UBool fHaveDefaultCentury;
01647
01648 const BreakIterator* fCapitalizationBrkIter;
01649 };
01650
01651 inline UDate
01652 SimpleDateFormat::get2DigitYearStart(UErrorCode& ) const
01653 {
01654 return fDefaultCenturyStart;
01655 }
01656
01657 U_NAMESPACE_END
01658
01659 #endif
01660
01661 #endif
01662
01663 #endif // _SMPDTFMT
01664