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 class DateIntervalFormat;
00053
00054 namespace number {
00055 class LocalizedNumberFormatter;
00056 }
00057
00724 class U_I18N_API SimpleDateFormat: public DateFormat {
00725 public:
00735 SimpleDateFormat(UErrorCode& status);
00736
00748 SimpleDateFormat(const UnicodeString& pattern,
00749 UErrorCode& status);
00750
00772 SimpleDateFormat(const UnicodeString& pattern,
00773 const UnicodeString& override,
00774 UErrorCode& status);
00775
00788 SimpleDateFormat(const UnicodeString& pattern,
00789 const Locale& locale,
00790 UErrorCode& status);
00791
00813 SimpleDateFormat(const UnicodeString& pattern,
00814 const UnicodeString& override,
00815 const Locale& locale,
00816 UErrorCode& status);
00817
00827 SimpleDateFormat(const UnicodeString& pattern,
00828 DateFormatSymbols* formatDataToAdopt,
00829 UErrorCode& status);
00830
00840 SimpleDateFormat(const UnicodeString& pattern,
00841 const DateFormatSymbols& formatData,
00842 UErrorCode& status);
00843
00848 SimpleDateFormat(const SimpleDateFormat&);
00849
00854 SimpleDateFormat& operator=(const SimpleDateFormat&);
00855
00860 virtual ~SimpleDateFormat();
00861
00868 virtual Format* clone(void) const;
00869
00877 virtual UBool operator==(const Format& other) const;
00878
00879
00880 using DateFormat::format;
00881
00898 virtual UnicodeString& format( Calendar& cal,
00899 UnicodeString& appendTo,
00900 FieldPosition& pos) const;
00901
00920 virtual UnicodeString& format( Calendar& cal,
00921 UnicodeString& appendTo,
00922 FieldPositionIterator* posIter,
00923 UErrorCode& status) const;
00924
00925 using DateFormat::parse;
00926
00953 virtual void parse( const UnicodeString& text,
00954 Calendar& cal,
00955 ParsePosition& pos) const;
00956
00957
00974 virtual void set2DigitYearStart(UDate d, UErrorCode& status);
00975
00991 UDate get2DigitYearStart(UErrorCode& status) const;
00992
00999 virtual UnicodeString& toPattern(UnicodeString& result) const;
01000
01023 virtual UnicodeString& toLocalizedPattern(UnicodeString& result,
01024 UErrorCode& status) const;
01025
01034 virtual void applyPattern(const UnicodeString& pattern);
01035
01046 virtual void applyLocalizedPattern(const UnicodeString& pattern,
01047 UErrorCode& status);
01048
01057 virtual const DateFormatSymbols* getDateFormatSymbols(void) const;
01058
01065 virtual void adoptDateFormatSymbols(DateFormatSymbols* newFormatSymbols);
01066
01072 virtual void setDateFormatSymbols(const DateFormatSymbols& newFormatSymbols);
01073
01085 static UClassID U_EXPORT2 getStaticClassID(void);
01086
01098 virtual UClassID getDynamicClassID(void) const;
01099
01109 virtual void adoptCalendar(Calendar* calendarToAdopt);
01110
01111
01119 virtual void adoptTimeZoneFormat(TimeZoneFormat* timeZoneFormatToAdopt);
01120
01126 virtual void setTimeZoneFormat(const TimeZoneFormat& newTimeZoneFormat);
01127
01133 virtual const TimeZoneFormat* getTimeZoneFormat(void) const;
01134
01145 virtual void setContext(UDisplayContext value, UErrorCode& status);
01146
01154 void adoptNumberFormat(NumberFormat *formatToAdopt);
01155
01171 void adoptNumberFormat(const UnicodeString& fields, NumberFormat *formatToAdopt, UErrorCode &status);
01172
01178 const NumberFormat * getNumberFormatForField(char16_t field) const;
01179
01180 #ifndef U_HIDE_INTERNAL_API
01181
01191 UBool isFieldUnitIgnored(UCalendarDateFields field) const;
01192
01193
01205 static UBool isFieldUnitIgnored(const UnicodeString& pattern,
01206 UCalendarDateFields field);
01207
01216 const Locale& getSmpFmtLocale(void) const;
01217 #endif
01218
01219 private:
01220 friend class DateFormat;
01221 friend class DateIntervalFormat;
01222
01223 void initializeDefaultCentury(void);
01224
01225 void initializeBooleanAttributes(void);
01226
01227 SimpleDateFormat();
01228
01237 SimpleDateFormat(EStyle timeStyle, EStyle dateStyle, const Locale& locale, UErrorCode& status);
01238
01247 SimpleDateFormat(const Locale& locale, UErrorCode& status);
01248
01252 UnicodeString& _format(Calendar& cal, UnicodeString& appendTo, FieldPositionHandler& handler, UErrorCode& status) const;
01253
01270 void subFormat(UnicodeString &appendTo,
01271 char16_t ch,
01272 int32_t count,
01273 UDisplayContext capitalizationContext,
01274 int32_t fieldNum,
01275 FieldPositionHandler& handler,
01276 Calendar& cal,
01277 UErrorCode& status) const;
01278
01292 void zeroPaddingNumber(const NumberFormat *currentNumberFormat,
01293 UnicodeString &appendTo,
01294 int32_t value,
01295 int32_t minDigits,
01296 int32_t maxDigits) const;
01297
01302 static UBool isNumeric(char16_t formatChar, int32_t count);
01303
01307 static UBool isAtNumericField(const UnicodeString &pattern, int32_t patternOffset);
01308
01312 static UBool isAfterNonNumericField(const UnicodeString &pattern, int32_t patternOffset);
01313
01321 Calendar *initializeCalendar(TimeZone* adoptZone, const Locale& locale, UErrorCode& status);
01322
01332 void construct(EStyle timeStyle, EStyle dateStyle, const Locale& locale, UErrorCode& status);
01333
01340 void initialize(const Locale& locale, UErrorCode& status);
01341
01355 int32_t matchString(const UnicodeString& text, int32_t start, UCalendarDateFields field,
01356 const UnicodeString* stringArray, int32_t stringArrayCount,
01357 const UnicodeString* monthPattern, Calendar& cal) const;
01358
01371 int32_t matchQuarterString(const UnicodeString& text, int32_t start, UCalendarDateFields field,
01372 const UnicodeString* stringArray, int32_t stringArrayCount, Calendar& cal) const;
01373
01377 int32_t matchDayPeriodStrings(const UnicodeString& text, int32_t start,
01378 const UnicodeString* stringArray, int32_t stringArrayCount,
01379 int32_t &dayPeriod) const;
01380
01396 static UBool matchLiterals(const UnicodeString &pattern, int32_t &patternOffset,
01397 const UnicodeString &text, int32_t &textOffset,
01398 UBool whitespaceLenient, UBool partialMatchLenient, UBool oldLeniency);
01399
01420 int32_t subParse(const UnicodeString& text, int32_t& start, char16_t ch, int32_t count,
01421 UBool obeyCount, UBool allowNegative, UBool ambiguousYear[], int32_t& saveHebrewMonth, Calendar& cal,
01422 int32_t patLoc, MessageFormat * numericLeapMonthFormatter, UTimeZoneFormatTimeType *tzTimeType,
01423 int32_t *dayPeriod=NULL) const;
01424
01425 void parseInt(const UnicodeString& text,
01426 Formattable& number,
01427 ParsePosition& pos,
01428 UBool allowNegative,
01429 const NumberFormat *fmt) const;
01430
01431 void parseInt(const UnicodeString& text,
01432 Formattable& number,
01433 int32_t maxDigits,
01434 ParsePosition& pos,
01435 UBool allowNegative,
01436 const NumberFormat *fmt) const;
01437
01438 int32_t checkIntSuffix(const UnicodeString& text, int32_t start,
01439 int32_t patLoc, UBool isNegative) const;
01440
01449 int32_t countDigits(const UnicodeString& text, int32_t start, int32_t end) const;
01450
01463 static void translatePattern(const UnicodeString& originalPattern,
01464 UnicodeString& translatedPattern,
01465 const UnicodeString& from,
01466 const UnicodeString& to,
01467 UErrorCode& status);
01468
01476 void parseAmbiguousDatesAsAfter(UDate startDate, UErrorCode& status);
01477
01487 int32_t compareSimpleAffix(const UnicodeString& affix,
01488 const UnicodeString& input,
01489 int32_t pos) const;
01490
01495 int32_t skipPatternWhiteSpace(const UnicodeString& text, int32_t pos) const;
01496
01501 int32_t skipUWhiteSpace(const UnicodeString& text, int32_t pos) const;
01502
01506 void initFastNumberFormatters(UErrorCode& status);
01507
01511 void freeFastNumberFormatters();
01512
01516 void initNumberFormatters(const Locale &locale,UErrorCode &status);
01517
01521 void processOverrideString(const Locale &locale, const UnicodeString &str, int8_t type, UErrorCode &status);
01522
01526 static const UCalendarDateFields fgPatternIndexToCalendarField[];
01527
01531 static const UDateFormatField fgPatternIndexToDateFormatField[];
01532
01536 TimeZoneFormat *tzFormat(UErrorCode &status) const;
01537
01538 const NumberFormat* getNumberFormatByIndex(UDateFormatField index) const;
01539
01546 static const int32_t fgCalendarFieldToLevel[];
01547
01551 static int32_t getLevelFromChar(char16_t ch);
01552
01556 static UBool isSyntaxChar(char16_t ch);
01557
01561 UnicodeString fPattern;
01562
01566 UnicodeString fDateOverride;
01567
01571 UnicodeString fTimeOverride;
01572
01573
01577 Locale fLocale;
01578
01583 DateFormatSymbols* fSymbols;
01584
01588 TimeZoneFormat* fTimeZoneFormat;
01589
01598 UDate fDefaultCenturyStart;
01599
01600 UBool fHasMinute;
01601 UBool fHasSecond;
01602 UBool fHasHanYearChar;
01603
01607 void parsePattern();
01608
01612 int32_t fDefaultCenturyStartYear;
01613
01614 struct NSOverride : public UMemory {
01615 const SharedNumberFormat *snf;
01616 int32_t hash;
01617 NSOverride *next;
01618 void free();
01619 NSOverride() : snf(NULL), hash(0), next(NULL) {
01620 }
01621 ~NSOverride();
01622 };
01623
01628 const SharedNumberFormat **fSharedNumberFormatters;
01629
01630 enum NumberFormatterKey {
01631 SMPDTFMT_NF_1x10,
01632 SMPDTFMT_NF_2x10,
01633 SMPDTFMT_NF_3x10,
01634 SMPDTFMT_NF_4x10,
01635 SMPDTFMT_NF_2x2,
01636 SMPDTFMT_NF_COUNT
01637 };
01638
01642 const number::LocalizedNumberFormatter* fFastNumberFormatters[SMPDTFMT_NF_COUNT] = {};
01643
01644 UBool fHaveDefaultCentury;
01645
01646 BreakIterator* fCapitalizationBrkIter;
01647 };
01648
01649 inline UDate
01650 SimpleDateFormat::get2DigitYearStart(UErrorCode& ) const
01651 {
01652 return fDefaultCenturyStart;
01653 }
01654
01655 U_NAMESPACE_END
01656
01657 #endif
01658
01659 #endif // _SMPDTFMT
01660