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
00053 namespace number {
00054 class LocalizedNumberFormatter;
00055 }
00056
00723 class U_I18N_API SimpleDateFormat: public DateFormat {
00724 public:
00734 SimpleDateFormat(UErrorCode& status);
00735
00747 SimpleDateFormat(const UnicodeString& pattern,
00748 UErrorCode& status);
00749
00771 SimpleDateFormat(const UnicodeString& pattern,
00772 const UnicodeString& override,
00773 UErrorCode& status);
00774
00787 SimpleDateFormat(const UnicodeString& pattern,
00788 const Locale& locale,
00789 UErrorCode& status);
00790
00812 SimpleDateFormat(const UnicodeString& pattern,
00813 const UnicodeString& override,
00814 const Locale& locale,
00815 UErrorCode& status);
00816
00826 SimpleDateFormat(const UnicodeString& pattern,
00827 DateFormatSymbols* formatDataToAdopt,
00828 UErrorCode& status);
00829
00839 SimpleDateFormat(const UnicodeString& pattern,
00840 const DateFormatSymbols& formatData,
00841 UErrorCode& status);
00842
00847 SimpleDateFormat(const SimpleDateFormat&);
00848
00853 SimpleDateFormat& operator=(const SimpleDateFormat&);
00854
00859 virtual ~SimpleDateFormat();
00860
00867 virtual Format* clone(void) const;
00868
00876 virtual UBool operator==(const Format& other) const;
00877
00878
00879 using DateFormat::format;
00880
00897 virtual UnicodeString& format( Calendar& cal,
00898 UnicodeString& appendTo,
00899 FieldPosition& pos) const;
00900
00919 virtual UnicodeString& format( Calendar& cal,
00920 UnicodeString& appendTo,
00921 FieldPositionIterator* posIter,
00922 UErrorCode& status) const;
00923
00924 using DateFormat::parse;
00925
00952 virtual void parse( const UnicodeString& text,
00953 Calendar& cal,
00954 ParsePosition& pos) const;
00955
00956
00973 virtual void set2DigitYearStart(UDate d, UErrorCode& status);
00974
00990 UDate get2DigitYearStart(UErrorCode& status) const;
00991
00998 virtual UnicodeString& toPattern(UnicodeString& result) const;
00999
01022 virtual UnicodeString& toLocalizedPattern(UnicodeString& result,
01023 UErrorCode& status) const;
01024
01033 virtual void applyPattern(const UnicodeString& pattern);
01034
01045 virtual void applyLocalizedPattern(const UnicodeString& pattern,
01046 UErrorCode& status);
01047
01056 virtual const DateFormatSymbols* getDateFormatSymbols(void) const;
01057
01064 virtual void adoptDateFormatSymbols(DateFormatSymbols* newFormatSymbols);
01065
01071 virtual void setDateFormatSymbols(const DateFormatSymbols& newFormatSymbols);
01072
01084 static UClassID U_EXPORT2 getStaticClassID(void);
01085
01097 virtual UClassID getDynamicClassID(void) const;
01098
01108 virtual void adoptCalendar(Calendar* calendarToAdopt);
01109
01110
01118 virtual void adoptTimeZoneFormat(TimeZoneFormat* timeZoneFormatToAdopt);
01119
01125 virtual void setTimeZoneFormat(const TimeZoneFormat& newTimeZoneFormat);
01126
01132 virtual const TimeZoneFormat* getTimeZoneFormat(void) const;
01133
01144 virtual void setContext(UDisplayContext value, UErrorCode& status);
01145
01153 void adoptNumberFormat(NumberFormat *formatToAdopt);
01154
01170 void adoptNumberFormat(const UnicodeString& fields, NumberFormat *formatToAdopt, UErrorCode &status);
01171
01177 const NumberFormat * getNumberFormatForField(char16_t field) const;
01178
01179 #ifndef U_HIDE_INTERNAL_API
01180
01190 UBool isFieldUnitIgnored(UCalendarDateFields field) const;
01191
01192
01204 static UBool isFieldUnitIgnored(const UnicodeString& pattern,
01205 UCalendarDateFields field);
01206
01215 const Locale& getSmpFmtLocale(void) const;
01216 #endif
01217
01218 private:
01219 friend class DateFormat;
01220
01221 void initializeDefaultCentury(void);
01222
01223 void initializeBooleanAttributes(void);
01224
01225 SimpleDateFormat();
01226
01235 SimpleDateFormat(EStyle timeStyle, EStyle dateStyle, const Locale& locale, UErrorCode& status);
01236
01245 SimpleDateFormat(const Locale& locale, UErrorCode& status);
01246
01250 UnicodeString& _format(Calendar& cal, UnicodeString& appendTo, FieldPositionHandler& handler, UErrorCode& status) const;
01251
01268 void subFormat(UnicodeString &appendTo,
01269 char16_t ch,
01270 int32_t count,
01271 UDisplayContext capitalizationContext,
01272 int32_t fieldNum,
01273 FieldPositionHandler& handler,
01274 Calendar& cal,
01275 UErrorCode& status) const;
01276
01290 void zeroPaddingNumber(const NumberFormat *currentNumberFormat,
01291 UnicodeString &appendTo,
01292 int32_t value,
01293 int32_t minDigits,
01294 int32_t maxDigits) const;
01295
01300 static UBool isNumeric(char16_t formatChar, int32_t count);
01301
01305 static UBool isAtNumericField(const UnicodeString &pattern, int32_t patternOffset);
01306
01310 static UBool isAfterNonNumericField(const UnicodeString &pattern, int32_t patternOffset);
01311
01319 Calendar *initializeCalendar(TimeZone* adoptZone, const Locale& locale, UErrorCode& status);
01320
01330 void construct(EStyle timeStyle, EStyle dateStyle, const Locale& locale, UErrorCode& status);
01331
01338 void initialize(const Locale& locale, UErrorCode& status);
01339
01353 int32_t matchString(const UnicodeString& text, int32_t start, UCalendarDateFields field,
01354 const UnicodeString* stringArray, int32_t stringArrayCount,
01355 const UnicodeString* monthPattern, Calendar& cal) const;
01356
01369 int32_t matchQuarterString(const UnicodeString& text, int32_t start, UCalendarDateFields field,
01370 const UnicodeString* stringArray, int32_t stringArrayCount, Calendar& cal) const;
01371
01375 int32_t matchDayPeriodStrings(const UnicodeString& text, int32_t start,
01376 const UnicodeString* stringArray, int32_t stringArrayCount,
01377 int32_t &dayPeriod) const;
01378
01394 static UBool matchLiterals(const UnicodeString &pattern, int32_t &patternOffset,
01395 const UnicodeString &text, int32_t &textOffset,
01396 UBool whitespaceLenient, UBool partialMatchLenient, UBool oldLeniency);
01397
01418 int32_t subParse(const UnicodeString& text, int32_t& start, char16_t ch, int32_t count,
01419 UBool obeyCount, UBool allowNegative, UBool ambiguousYear[], int32_t& saveHebrewMonth, Calendar& cal,
01420 int32_t patLoc, MessageFormat * numericLeapMonthFormatter, UTimeZoneFormatTimeType *tzTimeType,
01421 int32_t *dayPeriod=NULL) const;
01422
01423 void parseInt(const UnicodeString& text,
01424 Formattable& number,
01425 ParsePosition& pos,
01426 UBool allowNegative,
01427 const NumberFormat *fmt) const;
01428
01429 void parseInt(const UnicodeString& text,
01430 Formattable& number,
01431 int32_t maxDigits,
01432 ParsePosition& pos,
01433 UBool allowNegative,
01434 const NumberFormat *fmt) const;
01435
01436 int32_t checkIntSuffix(const UnicodeString& text, int32_t start,
01437 int32_t patLoc, UBool isNegative) const;
01438
01447 int32_t countDigits(const UnicodeString& text, int32_t start, int32_t end) const;
01448
01461 static void translatePattern(const UnicodeString& originalPattern,
01462 UnicodeString& translatedPattern,
01463 const UnicodeString& from,
01464 const UnicodeString& to,
01465 UErrorCode& status);
01466
01474 void parseAmbiguousDatesAsAfter(UDate startDate, UErrorCode& status);
01475
01485 int32_t compareSimpleAffix(const UnicodeString& affix,
01486 const UnicodeString& input,
01487 int32_t pos) const;
01488
01493 int32_t skipPatternWhiteSpace(const UnicodeString& text, int32_t pos) const;
01494
01499 int32_t skipUWhiteSpace(const UnicodeString& text, int32_t pos) const;
01500
01504 void initFastNumberFormatters(UErrorCode& status);
01505
01509 void freeFastNumberFormatters();
01510
01514 void initNumberFormatters(const Locale &locale,UErrorCode &status);
01515
01519 void processOverrideString(const Locale &locale, const UnicodeString &str, int8_t type, UErrorCode &status);
01520
01524 static const UCalendarDateFields fgPatternIndexToCalendarField[];
01525
01529 static const UDateFormatField fgPatternIndexToDateFormatField[];
01530
01534 TimeZoneFormat *tzFormat(UErrorCode &status) const;
01535
01536 const NumberFormat* getNumberFormatByIndex(UDateFormatField index) const;
01537
01544 static const int32_t fgCalendarFieldToLevel[];
01545
01549 static int32_t getLevelFromChar(char16_t ch);
01550
01554 static UBool isSyntaxChar(char16_t ch);
01555
01559 UnicodeString fPattern;
01560
01564 UnicodeString fDateOverride;
01565
01569 UnicodeString fTimeOverride;
01570
01571
01575 Locale fLocale;
01576
01581 DateFormatSymbols* fSymbols;
01582
01586 TimeZoneFormat* fTimeZoneFormat;
01587
01596 UDate fDefaultCenturyStart;
01597
01598 UBool fHasMinute;
01599 UBool fHasSecond;
01600
01604 void parsePattern();
01605
01609 int32_t fDefaultCenturyStartYear;
01610
01611 struct NSOverride : public UMemory {
01612 const SharedNumberFormat *snf;
01613 int32_t hash;
01614 NSOverride *next;
01615 void free();
01616 NSOverride() : snf(NULL), hash(0), next(NULL) {
01617 }
01618 ~NSOverride();
01619 };
01620
01625 const SharedNumberFormat **fSharedNumberFormatters;
01626
01627 enum NumberFormatterKey {
01628 SMPDTFMT_NF_1x10,
01629 SMPDTFMT_NF_2x10,
01630 SMPDTFMT_NF_3x10,
01631 SMPDTFMT_NF_4x10,
01632 SMPDTFMT_NF_2x2,
01633 SMPDTFMT_NF_COUNT
01634 };
01635
01639 const number::LocalizedNumberFormatter* fFastNumberFormatters[SMPDTFMT_NF_COUNT] = {};
01640
01641 UBool fHaveDefaultCentury;
01642
01643 BreakIterator* fCapitalizationBrkIter;
01644 };
01645
01646 inline UDate
01647 SimpleDateFormat::get2DigitYearStart(UErrorCode& ) const
01648 {
01649 return fDefaultCenturyStart;
01650 }
01651
01652 U_NAMESPACE_END
01653
01654 #endif
01655
01656 #endif // _SMPDTFMT
01657