ICU 51.2  51.2
smpdtfmt.h
Go to the documentation of this file.
00001 /*
00002 * Copyright (C) 1997-2013, International Business Machines Corporation and
00003 * others. All Rights Reserved.
00004 *******************************************************************************
00005 *
00006 * File SMPDTFMT.H
00007 *
00008 * Modification History:
00009 *
00010 *   Date        Name        Description
00011 *   02/19/97    aliu        Converted from java.
00012 *   07/09/97    helena      Make ParsePosition into a class.
00013 *   07/21/98    stephen     Added GMT_PLUS, GMT_MINUS
00014 *                            Changed setTwoDigitStartDate to set2DigitYearStart
00015 *                            Changed getTwoDigitStartDate to get2DigitYearStart
00016 *                            Removed subParseLong
00017 *                            Removed getZoneIndex (added in DateFormatSymbols)
00018 *   06/14/99    stephen     Removed fgTimeZoneDataSuffix
00019 *   10/14/99    aliu        Updated class doc to describe 2-digit year parsing
00020 *                           {j28 4182066}.
00021 *******************************************************************************
00022 */
00023 
00024 #ifndef SMPDTFMT_H
00025 #define SMPDTFMT_H
00026 
00027 #include "unicode/utypes.h"
00028 
00034 #if !UCONFIG_NO_FORMATTING
00035 
00036 #include "unicode/datefmt.h"
00037 #include "unicode/udisplaycontext.h"
00038 
00039 U_NAMESPACE_BEGIN
00040 
00041 class DateFormatSymbols;
00042 class DateFormat;
00043 class MessageFormat;
00044 class FieldPositionHandler;
00045 class TimeZoneFormat;
00046 
00703 class U_I18N_API SimpleDateFormat: public DateFormat {
00704 public:
00714     SimpleDateFormat(UErrorCode& status);
00715 
00727     SimpleDateFormat(const UnicodeString& pattern,
00728                      UErrorCode& status);
00729 
00751     SimpleDateFormat(const UnicodeString& pattern,
00752                      const UnicodeString& override,
00753                      UErrorCode& status);
00754 
00767     SimpleDateFormat(const UnicodeString& pattern,
00768                      const Locale& locale,
00769                      UErrorCode& status);
00770 
00792     SimpleDateFormat(const UnicodeString& pattern,
00793                      const UnicodeString& override,
00794                      const Locale& locale,
00795                      UErrorCode& status);
00796 
00806     SimpleDateFormat(const UnicodeString& pattern,
00807                      DateFormatSymbols* formatDataToAdopt,
00808                      UErrorCode& status);
00809 
00819     SimpleDateFormat(const UnicodeString& pattern,
00820                      const DateFormatSymbols& formatData,
00821                      UErrorCode& status);
00822 
00827     SimpleDateFormat(const SimpleDateFormat&);
00828 
00833     SimpleDateFormat& operator=(const SimpleDateFormat&);
00834 
00839     virtual ~SimpleDateFormat();
00840 
00847     virtual Format* clone(void) const;
00848 
00856     virtual UBool operator==(const Format& other) const;
00857 
00858 
00859     using DateFormat::format;
00860 
00877     virtual UnicodeString& format(  Calendar& cal,
00878                                     UnicodeString& appendTo,
00879                                     FieldPosition& pos) const;
00880 
00899     virtual UnicodeString& format(  Calendar& cal,
00900                                     UnicodeString& appendTo,
00901                                     FieldPositionIterator* posIter,
00902                                     UErrorCode& status) const;
00903 
00923     virtual UnicodeString& format(  const Formattable& obj,
00924                                     UnicodeString& appendTo,
00925                                     FieldPosition& pos,
00926                                     UErrorCode& status) const;
00927 
00948     virtual UnicodeString& format(  const Formattable& obj,
00949                                     UnicodeString& appendTo,
00950                                     FieldPositionIterator* posIter,
00951                                     UErrorCode& status) const;
00952 
00963     UnicodeString& format(UDate date,
00964                           UnicodeString& appendTo,
00965                           FieldPosition& fieldPosition) const;
00966 
00979     UnicodeString& format(UDate date,
00980                           UnicodeString& appendTo,
00981                           FieldPositionIterator* posIter,
00982                           UErrorCode& status) const;
00983 
00993     UnicodeString& format(const Formattable& obj,
00994                           UnicodeString& appendTo,
00995                           UErrorCode& status) const;
00996 
01005     UnicodeString& format(UDate date, UnicodeString& appendTo) const;
01006 
01033     virtual void parse( const UnicodeString& text,
01034                         Calendar& cal,
01035                         ParsePosition& pos) const;
01036 
01067     UDate parse( const UnicodeString& text,
01068                  ParsePosition& pos) const;
01069 
01070 
01104     virtual UDate parse( const UnicodeString& text,
01105                         UErrorCode& status) const;
01106 
01123     virtual void set2DigitYearStart(UDate d, UErrorCode& status);
01124 
01140     UDate get2DigitYearStart(UErrorCode& status) const;
01141 
01148     virtual UnicodeString& toPattern(UnicodeString& result) const;
01149 
01166     virtual UnicodeString& toLocalizedPattern(UnicodeString& result,
01167                                               UErrorCode& status) const;
01168 
01177     virtual void applyPattern(const UnicodeString& pattern);
01178 
01189     virtual void applyLocalizedPattern(const UnicodeString& pattern,
01190                                        UErrorCode& status);
01191 
01200     virtual const DateFormatSymbols* getDateFormatSymbols(void) const;
01201 
01208     virtual void adoptDateFormatSymbols(DateFormatSymbols* newFormatSymbols);
01209 
01215     virtual void setDateFormatSymbols(const DateFormatSymbols& newFormatSymbols);
01216 
01228     static UClassID U_EXPORT2 getStaticClassID(void);
01229 
01241     virtual UClassID getDynamicClassID(void) const;
01242 
01252     virtual void adoptCalendar(Calendar* calendarToAdopt);
01253 
01254     /* Cannot use #ifndef U_HIDE_DRAFT_API for the following draft method since it is virtual */
01264     virtual void setContext(UDisplayContext value, UErrorCode& status);
01265 
01266     /* Cannot use #ifndef U_HIDE_DRAFT_API for the following draft method since it is virtual */
01277     virtual UDisplayContext getContext(UDisplayContextType type, UErrorCode& status) const;
01278 
01279     /* Cannot use #ifndef U_HIDE_INTERNAL_API for the following methods since they are virtual */
01287     virtual void adoptTimeZoneFormat(TimeZoneFormat* timeZoneFormatToAdopt);
01288 
01294     virtual void setTimeZoneFormat(const TimeZoneFormat& newTimeZoneFormat);
01295 
01301     virtual const TimeZoneFormat* getTimeZoneFormat(void) const;
01302 
01303 #ifndef U_HIDE_INTERNAL_API
01304 
01314     UBool isFieldUnitIgnored(UCalendarDateFields field) const;
01315 
01316 
01328     static UBool isFieldUnitIgnored(const UnicodeString& pattern,
01329                                     UCalendarDateFields field);
01330 
01339     const Locale& getSmpFmtLocale(void) const;
01340 #endif  /* U_HIDE_INTERNAL_API */
01341 
01342 private:
01343     friend class DateFormat;
01344 
01345     void initializeDefaultCentury(void);
01346 
01347     SimpleDateFormat(); // default constructor not implemented
01348 
01357     SimpleDateFormat(EStyle timeStyle, EStyle dateStyle, const Locale& locale, UErrorCode& status);
01358 
01367     SimpleDateFormat(const Locale& locale, UErrorCode& status); // Use default pattern
01368 
01372     UnicodeString& _format(Calendar& cal, UnicodeString& appendTo, FieldPositionHandler& handler, UErrorCode& status) const;
01373 
01390     void subFormat(UnicodeString &appendTo,
01391                    UChar ch,
01392                    int32_t count,
01393                    UDisplayContext capitalizationContext,
01394                    int32_t fieldNum,
01395                    FieldPositionHandler& handler,
01396                    Calendar& cal,
01397                    UErrorCode& status) const; // in case of illegal argument
01398 
01412     void zeroPaddingNumber(NumberFormat *currentNumberFormat,
01413                            UnicodeString &appendTo,
01414                            int32_t value,
01415                            int32_t minDigits,
01416                            int32_t maxDigits) const;
01417 
01422     static UBool isNumeric(UChar formatChar, int32_t count);
01423 
01427     static UBool isAtNumericField(const UnicodeString &pattern, int32_t patternOffset);
01428 
01432     static UBool isAfterNonNumericField(const UnicodeString &pattern, int32_t patternOffset);
01433 
01441     Calendar *initializeCalendar(TimeZone* adoptZone, const Locale& locale, UErrorCode& status);
01442 
01449     void initializeSymbols(const Locale& locale, Calendar* calendar, UErrorCode& status);
01450 
01460     void construct(EStyle timeStyle, EStyle dateStyle, const Locale& locale, UErrorCode& status);
01461 
01468     void initialize(const Locale& locale, UErrorCode& status);
01469 
01483     int32_t matchString(const UnicodeString& text, int32_t start, UCalendarDateFields field,
01484                         const UnicodeString* stringArray, int32_t stringArrayCount,
01485                         const UnicodeString* monthPattern, Calendar& cal) const;
01486 
01499     int32_t matchQuarterString(const UnicodeString& text, int32_t start, UCalendarDateFields field,
01500                                const UnicodeString* stringArray, int32_t stringArrayCount, Calendar& cal) const;
01501     
01515     static UBool matchLiterals(const UnicodeString &pattern, int32_t &patternOffset,
01516                                const UnicodeString &text, int32_t &textOffset, UBool lenient);
01517     
01536     int32_t subParse(const UnicodeString& text, int32_t& start, UChar ch, int32_t count,
01537                      UBool obeyCount, UBool allowNegative, UBool ambiguousYear[], int32_t& saveHebrewMonth, Calendar& cal,
01538                      int32_t patLoc, MessageFormat * numericLeapMonthFormatter) const;
01539 
01540     void parseInt(const UnicodeString& text,
01541                   Formattable& number,
01542                   ParsePosition& pos,
01543                   UBool allowNegative,
01544                   NumberFormat *fmt) const;
01545 
01546     void parseInt(const UnicodeString& text,
01547                   Formattable& number,
01548                   int32_t maxDigits,
01549                   ParsePosition& pos,
01550                   UBool allowNegative,
01551                   NumberFormat *fmt) const;
01552 
01553     int32_t checkIntSuffix(const UnicodeString& text, int32_t start,
01554                            int32_t patLoc, UBool isNegative) const;
01555 
01568     static void translatePattern(const UnicodeString& originalPattern,
01569                                 UnicodeString& translatedPattern,
01570                                 const UnicodeString& from,
01571                                 const UnicodeString& to,
01572                                 UErrorCode& status);
01573 
01581     void         parseAmbiguousDatesAsAfter(UDate startDate, UErrorCode& status);
01582 
01592     int32_t compareSimpleAffix(const UnicodeString& affix,
01593                    const UnicodeString& input,
01594                    int32_t pos) const;
01595 
01600     int32_t skipPatternWhiteSpace(const UnicodeString& text, int32_t pos) const;
01601 
01606     int32_t skipUWhiteSpace(const UnicodeString& text, int32_t pos) const;
01607 
01611     void initNumberFormatters(const Locale &locale,UErrorCode &status);
01612 
01616      NumberFormat * getNumberFormatByIndex(UDateFormatField index) const;
01617 
01621     void processOverrideString(const Locale &locale, const UnicodeString &str, int8_t type, UErrorCode &status);
01622 
01626     static const UCalendarDateFields fgPatternIndexToCalendarField[];
01627 
01631     static const UDateFormatField fgPatternIndexToDateFormatField[];
01632 
01636     TimeZoneFormat *tzFormat() const;
01637 
01644     static const int32_t fgCalendarFieldToLevel[];
01645     static const int32_t fgPatternCharToLevel[];
01646 
01650     UnicodeString       fPattern;
01651 
01655     UnicodeString       fDateOverride;
01656 
01660     UnicodeString       fTimeOverride;
01661 
01662 
01666     Locale              fLocale;
01667 
01672     DateFormatSymbols*  fSymbols;   // Owned
01673 
01677     TimeZoneFormat* fTimeZoneFormat;
01678 
01687     UDate                fDefaultCenturyStart;
01688 
01692     /*transient*/ int32_t   fDefaultCenturyStartYear;
01693 
01694     int32_t tztype; // here to avoid api change
01695 
01696     typedef struct NSOverride {
01697         NumberFormat *nf;
01698         int32_t hash;
01699         NSOverride *next;
01700     } NSOverride;
01701 
01702     NumberFormat    **fNumberFormatters;
01703 
01704     NSOverride      *fOverrideList;
01705 
01706     UBool fHaveDefaultCentury;
01707 
01708     UDisplayContext fCapitalizationContext;
01709 };
01710 
01711 inline UDate
01712 SimpleDateFormat::get2DigitYearStart(UErrorCode& /*status*/) const
01713 {
01714     return fDefaultCenturyStart;
01715 }
01716 
01717 inline UnicodeString&
01718 SimpleDateFormat::format(const Formattable& obj,
01719                          UnicodeString& appendTo,
01720                          UErrorCode& status) const {
01721     // Don't use Format:: - use immediate base class only,
01722     // in case immediate base modifies behavior later.
01723     return DateFormat::format(obj, appendTo, status);
01724 }
01725 
01726 inline UnicodeString&
01727 SimpleDateFormat::format(const Formattable& obj,
01728                          UnicodeString& appendTo,
01729                          FieldPosition& pos,
01730                          UErrorCode& status) const
01731 {
01732     // Don't use Format:: - use immediate base class only,
01733     // in case immediate base modifies behavior later.
01734     return DateFormat::format(obj, appendTo, pos, status);
01735 }
01736 
01737 inline UnicodeString&
01738 SimpleDateFormat::format(const Formattable& obj,
01739                          UnicodeString& appendTo,
01740                          FieldPositionIterator* posIter,
01741                          UErrorCode& status) const
01742 {
01743     // Don't use Format:: - use immediate base class only,
01744     // in case immediate base modifies behavior later.
01745     return DateFormat::format(obj, appendTo, posIter, status);
01746 }
01747 
01748 inline UnicodeString&
01749 SimpleDateFormat::format(UDate date,
01750                          UnicodeString& appendTo,
01751                          FieldPosition& fieldPosition) const {
01752     // Don't use Format:: - use immediate base class only,
01753     // in case immediate base modifies behavior later.
01754     return DateFormat::format(date, appendTo, fieldPosition);
01755 }
01756 
01757 inline UnicodeString&
01758 SimpleDateFormat::format(UDate date,
01759                          UnicodeString& appendTo,
01760                          FieldPositionIterator* posIter,
01761                          UErrorCode& status) const {
01762     // Don't use Format:: - use immediate base class only,
01763     // in case immediate base modifies behavior later.
01764     return DateFormat::format(date, appendTo, posIter, status);
01765 }
01766 
01767 inline UnicodeString&
01768 SimpleDateFormat::format(UDate date, UnicodeString& appendTo) const {
01769     return DateFormat::format(date, appendTo);
01770 }
01771 
01772 U_NAMESPACE_END
01773 
01774 #endif /* #if !UCONFIG_NO_FORMATTING */
01775 
01776 #endif // _SMPDTFMT
01777 //eof
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines