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 char16_t fieldToOutput,
01278 FieldPositionHandler& handler,
01279 Calendar& cal,
01280 UErrorCode& status) const;
01281
01295 void zeroPaddingNumber(const NumberFormat *currentNumberFormat,
01296 UnicodeString &appendTo,
01297 int32_t value,
01298 int32_t minDigits,
01299 int32_t maxDigits) const;
01300
01305 static UBool isNumeric(char16_t formatChar, int32_t count);
01306
01310 static UBool isAtNumericField(const UnicodeString &pattern, int32_t patternOffset);
01311
01315 static UBool isAfterNonNumericField(const UnicodeString &pattern, int32_t patternOffset);
01316
01324 Calendar *initializeCalendar(TimeZone* adoptZone, const Locale& locale, UErrorCode& status);
01325
01335 void construct(EStyle timeStyle, EStyle dateStyle, const Locale& locale, UErrorCode& status);
01336
01343 void initialize(const Locale& locale, UErrorCode& status);
01344
01358 int32_t matchString(const UnicodeString& text, int32_t start, UCalendarDateFields field,
01359 const UnicodeString* stringArray, int32_t stringArrayCount,
01360 const UnicodeString* monthPattern, Calendar& cal) const;
01361
01374 int32_t matchQuarterString(const UnicodeString& text, int32_t start, UCalendarDateFields field,
01375 const UnicodeString* stringArray, int32_t stringArrayCount, Calendar& cal) const;
01376
01380 int32_t matchDayPeriodStrings(const UnicodeString& text, int32_t start,
01381 const UnicodeString* stringArray, int32_t stringArrayCount,
01382 int32_t &dayPeriod) const;
01383
01399 static UBool matchLiterals(const UnicodeString &pattern, int32_t &patternOffset,
01400 const UnicodeString &text, int32_t &textOffset,
01401 UBool whitespaceLenient, UBool partialMatchLenient, UBool oldLeniency);
01402
01423 int32_t subParse(const UnicodeString& text, int32_t& start, char16_t ch, int32_t count,
01424 UBool obeyCount, UBool allowNegative, UBool ambiguousYear[], int32_t& saveHebrewMonth, Calendar& cal,
01425 int32_t patLoc, MessageFormat * numericLeapMonthFormatter, UTimeZoneFormatTimeType *tzTimeType,
01426 int32_t *dayPeriod=NULL) const;
01427
01428 void parseInt(const UnicodeString& text,
01429 Formattable& number,
01430 ParsePosition& pos,
01431 UBool allowNegative,
01432 const NumberFormat *fmt) const;
01433
01434 void parseInt(const UnicodeString& text,
01435 Formattable& number,
01436 int32_t maxDigits,
01437 ParsePosition& pos,
01438 UBool allowNegative,
01439 const NumberFormat *fmt) const;
01440
01441 int32_t checkIntSuffix(const UnicodeString& text, int32_t start,
01442 int32_t patLoc, UBool isNegative) const;
01443
01452 int32_t countDigits(const UnicodeString& text, int32_t start, int32_t end) const;
01453
01466 static void translatePattern(const UnicodeString& originalPattern,
01467 UnicodeString& translatedPattern,
01468 const UnicodeString& from,
01469 const UnicodeString& to,
01470 UErrorCode& status);
01471
01479 void parseAmbiguousDatesAsAfter(UDate startDate, UErrorCode& status);
01480
01490 int32_t compareSimpleAffix(const UnicodeString& affix,
01491 const UnicodeString& input,
01492 int32_t pos) const;
01493
01498 int32_t skipPatternWhiteSpace(const UnicodeString& text, int32_t pos) const;
01499
01504 int32_t skipUWhiteSpace(const UnicodeString& text, int32_t pos) const;
01505
01509 void initFastNumberFormatters(UErrorCode& status);
01510
01514 void freeFastNumberFormatters();
01515
01519 void initNumberFormatters(const Locale &locale,UErrorCode &status);
01520
01524 void processOverrideString(const Locale &locale, const UnicodeString &str, int8_t type, UErrorCode &status);
01525
01529 static const UCalendarDateFields fgPatternIndexToCalendarField[];
01530
01534 static const UDateFormatField fgPatternIndexToDateFormatField[];
01535
01539 TimeZoneFormat *tzFormat(UErrorCode &status) const;
01540
01541 const NumberFormat* getNumberFormatByIndex(UDateFormatField index) const;
01542
01549 static const int32_t fgCalendarFieldToLevel[];
01550
01554 static int32_t getLevelFromChar(char16_t ch);
01555
01559 static UBool isSyntaxChar(char16_t ch);
01560
01564 UnicodeString fPattern;
01565
01569 UnicodeString fDateOverride;
01570
01574 UnicodeString fTimeOverride;
01575
01576
01580 Locale fLocale;
01581
01586 DateFormatSymbols* fSymbols;
01587
01591 TimeZoneFormat* fTimeZoneFormat;
01592
01601 UDate fDefaultCenturyStart;
01602
01603 UBool fHasMinute;
01604 UBool fHasSecond;
01605 UBool fHasHanYearChar;
01606
01610 void parsePattern();
01611
01615 int32_t fDefaultCenturyStartYear;
01616
01617 struct NSOverride : public UMemory {
01618 const SharedNumberFormat *snf;
01619 int32_t hash;
01620 NSOverride *next;
01621 void free();
01622 NSOverride() : snf(NULL), hash(0), next(NULL) {
01623 }
01624 ~NSOverride();
01625 };
01626
01631 const SharedNumberFormat **fSharedNumberFormatters;
01632
01633 enum NumberFormatterKey {
01634 SMPDTFMT_NF_1x10,
01635 SMPDTFMT_NF_2x10,
01636 SMPDTFMT_NF_3x10,
01637 SMPDTFMT_NF_4x10,
01638 SMPDTFMT_NF_2x2,
01639 SMPDTFMT_NF_COUNT
01640 };
01641
01645 const number::LocalizedNumberFormatter* fFastNumberFormatters[SMPDTFMT_NF_COUNT] = {};
01646
01647 UBool fHaveDefaultCentury;
01648
01649 const BreakIterator* fCapitalizationBrkIter;
01650 };
01651
01652 inline UDate
01653 SimpleDateFormat::get2DigitYearStart(UErrorCode& ) const
01654 {
01655 return fDefaultCenturyStart;
01656 }
01657
01658 U_NAMESPACE_END
01659
01660 #endif
01661
01662 #endif
01663
01664 #endif // _SMPDTFMT
01665