|
ICU 73.2
73.2
|
00001 // © 2016 and later: Unicode, Inc. and others. 00002 // License & terms of use: http://www.unicode.org/copyright.html 00003 /* 00004 * Copyright (C) 1997-2016, International Business Machines Corporation and 00005 * others. All Rights Reserved. 00006 ******************************************************************************* 00007 * 00008 * File SMPDTFMT.H 00009 * 00010 * Modification History: 00011 * 00012 * Date Name Description 00013 * 02/19/97 aliu Converted from java. 00014 * 07/09/97 helena Make ParsePosition into a class. 00015 * 07/21/98 stephen Added GMT_PLUS, GMT_MINUS 00016 * Changed setTwoDigitStartDate to set2DigitYearStart 00017 * Changed getTwoDigitStartDate to get2DigitYearStart 00018 * Removed subParseLong 00019 * Removed getZoneIndex (added in DateFormatSymbols) 00020 * 06/14/99 stephen Removed fgTimeZoneDataSuffix 00021 * 10/14/99 aliu Updated class doc to describe 2-digit year parsing 00022 * {j28 4182066}. 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" /* for UTimeZoneFormatTimeType */ 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 class SimpleNumberFormatter; 00059 } 00060 00727 class U_I18N_API SimpleDateFormat: public DateFormat { 00728 public: 00738 SimpleDateFormat(UErrorCode& status); 00739 00751 SimpleDateFormat(const UnicodeString& pattern, 00752 UErrorCode& status); 00753 00775 SimpleDateFormat(const UnicodeString& pattern, 00776 const UnicodeString& override, 00777 UErrorCode& status); 00778 00791 SimpleDateFormat(const UnicodeString& pattern, 00792 const Locale& locale, 00793 UErrorCode& status); 00794 00816 SimpleDateFormat(const UnicodeString& pattern, 00817 const UnicodeString& override, 00818 const Locale& locale, 00819 UErrorCode& status); 00820 00830 SimpleDateFormat(const UnicodeString& pattern, 00831 DateFormatSymbols* formatDataToAdopt, 00832 UErrorCode& status); 00833 00843 SimpleDateFormat(const UnicodeString& pattern, 00844 const DateFormatSymbols& formatData, 00845 UErrorCode& status); 00846 00851 SimpleDateFormat(const SimpleDateFormat&); 00852 00857 SimpleDateFormat& operator=(const SimpleDateFormat&); 00858 00863 virtual ~SimpleDateFormat(); 00864 00871 virtual SimpleDateFormat* clone() const override; 00872 00880 virtual bool operator==(const Format& other) const override; 00881 00882 00883 using DateFormat::format; 00884 00901 virtual UnicodeString& format( Calendar& cal, 00902 UnicodeString& appendTo, 00903 FieldPosition& pos) const override; 00904 00923 virtual UnicodeString& format( Calendar& cal, 00924 UnicodeString& appendTo, 00925 FieldPositionIterator* posIter, 00926 UErrorCode& status) const override; 00927 00928 using DateFormat::parse; 00929 00956 virtual void parse( const UnicodeString& text, 00957 Calendar& cal, 00958 ParsePosition& pos) const override; 00959 00960 00977 virtual void set2DigitYearStart(UDate d, UErrorCode& status); 00978 00994 UDate get2DigitYearStart(UErrorCode& status) const; 00995 01002 virtual UnicodeString& toPattern(UnicodeString& result) const; 01003 01026 virtual UnicodeString& toLocalizedPattern(UnicodeString& result, 01027 UErrorCode& status) const; 01028 01037 virtual void applyPattern(const UnicodeString& pattern); 01038 01049 virtual void applyLocalizedPattern(const UnicodeString& pattern, 01050 UErrorCode& status); 01051 01060 virtual const DateFormatSymbols* getDateFormatSymbols(void) const; 01061 01068 virtual void adoptDateFormatSymbols(DateFormatSymbols* newFormatSymbols); 01069 01075 virtual void setDateFormatSymbols(const DateFormatSymbols& newFormatSymbols); 01076 01088 static UClassID U_EXPORT2 getStaticClassID(void); 01089 01101 virtual UClassID getDynamicClassID(void) const override; 01102 01112 virtual void adoptCalendar(Calendar* calendarToAdopt) override; 01113 01114 /* Cannot use #ifndef U_HIDE_INTERNAL_API for the following methods since they are virtual */ 01122 virtual void adoptTimeZoneFormat(TimeZoneFormat* timeZoneFormatToAdopt); 01123 01129 virtual void setTimeZoneFormat(const TimeZoneFormat& newTimeZoneFormat); 01130 01136 virtual const TimeZoneFormat* getTimeZoneFormat(void) const; 01137 01148 virtual void setContext(UDisplayContext value, UErrorCode& status) override; 01149 01157 void adoptNumberFormat(NumberFormat *formatToAdopt) override; 01158 01174 void adoptNumberFormat(const UnicodeString& fields, NumberFormat *formatToAdopt, UErrorCode &status); 01175 01181 const NumberFormat * getNumberFormatForField(char16_t field) const; 01182 01183 #ifndef U_HIDE_INTERNAL_API 01184 01194 UBool isFieldUnitIgnored(UCalendarDateFields field) const; 01195 01196 01208 static UBool isFieldUnitIgnored(const UnicodeString& pattern, 01209 UCalendarDateFields field); 01210 01219 const Locale& getSmpFmtLocale(void) const; 01220 #endif /* U_HIDE_INTERNAL_API */ 01221 01222 private: 01223 friend class DateFormat; 01224 friend class DateIntervalFormat; 01225 01226 void initializeDefaultCentury(void); 01227 01228 void initializeBooleanAttributes(void); 01229 01230 SimpleDateFormat() = delete; // default constructor not implemented 01231 01240 SimpleDateFormat(EStyle timeStyle, EStyle dateStyle, const Locale& locale, UErrorCode& status); 01241 01250 SimpleDateFormat(const Locale& locale, UErrorCode& status); // Use default pattern 01251 01255 UnicodeString& _format(Calendar& cal, UnicodeString& appendTo, FieldPositionHandler& handler, UErrorCode& status) const; 01256 01273 void subFormat(UnicodeString &appendTo, 01274 char16_t ch, 01275 int32_t count, 01276 UDisplayContext capitalizationContext, 01277 int32_t fieldNum, 01278 char16_t fieldToOutput, 01279 FieldPositionHandler& handler, 01280 Calendar& cal, 01281 UErrorCode& status) const; // in case of illegal argument 01282 01296 void zeroPaddingNumber(const NumberFormat *currentNumberFormat, 01297 UnicodeString &appendTo, 01298 int32_t value, 01299 int32_t minDigits, 01300 int32_t maxDigits) const; 01301 01306 static UBool isNumeric(char16_t formatChar, int32_t count); 01307 01311 static UBool isAtNumericField(const UnicodeString &pattern, int32_t patternOffset); 01312 01316 static UBool isAfterNonNumericField(const UnicodeString &pattern, int32_t patternOffset); 01317 01325 Calendar *initializeCalendar(TimeZone* adoptZone, const Locale& locale, UErrorCode& status); 01326 01336 void construct(EStyle timeStyle, EStyle dateStyle, const Locale& locale, UErrorCode& status); 01337 01344 void initialize(const Locale& locale, UErrorCode& status); 01345 01359 int32_t matchString(const UnicodeString& text, int32_t start, UCalendarDateFields field, 01360 const UnicodeString* stringArray, int32_t stringArrayCount, 01361 const UnicodeString* monthPattern, Calendar& cal) const; 01362 01375 int32_t matchAlphaMonthStrings(const UnicodeString& text, int32_t start, 01376 const UnicodeString* wideStringArray, const UnicodeString* shortStringArray, 01377 int32_t stringArrayCount, Calendar& cal) const; 01378 01391 int32_t matchQuarterString(const UnicodeString& text, int32_t start, UCalendarDateFields field, 01392 const UnicodeString* stringArray, int32_t stringArrayCount, Calendar& cal) const; 01393 01397 int32_t matchDayPeriodStrings(const UnicodeString& text, int32_t start, 01398 const UnicodeString* stringArray, int32_t stringArrayCount, 01399 int32_t &dayPeriod) const; 01400 01416 static UBool matchLiterals(const UnicodeString &pattern, int32_t &patternOffset, 01417 const UnicodeString &text, int32_t &textOffset, 01418 UBool whitespaceLenient, UBool partialMatchLenient, UBool oldLeniency); 01419 01440 int32_t subParse(const UnicodeString& text, int32_t& start, char16_t ch, int32_t count, 01441 UBool obeyCount, UBool allowNegative, UBool ambiguousYear[], int32_t& saveHebrewMonth, Calendar& cal, 01442 int32_t patLoc, MessageFormat * numericLeapMonthFormatter, UTimeZoneFormatTimeType *tzTimeType, 01443 int32_t *dayPeriod=nullptr) const; 01444 01445 void parseInt(const UnicodeString& text, 01446 Formattable& number, 01447 ParsePosition& pos, 01448 UBool allowNegative, 01449 const NumberFormat *fmt) const; 01450 01451 void parseInt(const UnicodeString& text, 01452 Formattable& number, 01453 int32_t maxDigits, 01454 ParsePosition& pos, 01455 UBool allowNegative, 01456 const NumberFormat *fmt) const; 01457 01458 int32_t checkIntSuffix(const UnicodeString& text, int32_t start, 01459 int32_t patLoc, UBool isNegative) const; 01460 01469 int32_t countDigits(const UnicodeString& text, int32_t start, int32_t end) const; 01470 01483 static void translatePattern(const UnicodeString& originalPattern, 01484 UnicodeString& translatedPattern, 01485 const UnicodeString& from, 01486 const UnicodeString& to, 01487 UErrorCode& status); 01488 01496 void parseAmbiguousDatesAsAfter(UDate startDate, UErrorCode& status); 01497 01507 int32_t compareSimpleAffix(const UnicodeString& affix, 01508 const UnicodeString& input, 01509 int32_t pos) const; 01510 01515 int32_t skipPatternWhiteSpace(const UnicodeString& text, int32_t pos) const; 01516 01521 int32_t skipUWhiteSpace(const UnicodeString& text, int32_t pos) const; 01522 01526 void initSimpleNumberFormatter(UErrorCode &status); 01527 01531 void initNumberFormatters(const Locale &locale,UErrorCode &status); 01532 01536 void processOverrideString(const Locale &locale, const UnicodeString &str, int8_t type, UErrorCode &status); 01537 01541 static const UCalendarDateFields fgPatternIndexToCalendarField[]; 01542 01546 static const UDateFormatField fgPatternIndexToDateFormatField[]; 01547 01551 TimeZoneFormat *tzFormat(UErrorCode &status) const; 01552 01553 const NumberFormat* getNumberFormatByIndex(UDateFormatField index) const; 01554 01561 static const int32_t fgCalendarFieldToLevel[]; 01562 01566 static int32_t getLevelFromChar(char16_t ch); 01567 01571 static UBool isSyntaxChar(char16_t ch); 01572 01576 UnicodeString fPattern; 01577 01581 UnicodeString fDateOverride; 01582 01586 UnicodeString fTimeOverride; 01587 01588 01592 Locale fLocale; 01593 01598 DateFormatSymbols* fSymbols = nullptr; // Owned 01599 01603 TimeZoneFormat* fTimeZoneFormat = nullptr; 01604 01613 UDate fDefaultCenturyStart; 01614 01615 UBool fHasMinute; 01616 UBool fHasSecond; 01617 UBool fHasHanYearChar; // pattern contains the Han year character \u5E74 01618 01622 void parsePattern(); 01623 01627 /*transient*/ int32_t fDefaultCenturyStartYear; 01628 01629 struct NSOverride : public UMemory { 01630 const SharedNumberFormat *snf; 01631 int32_t hash; 01632 NSOverride *next; 01633 void free(); 01634 NSOverride() : snf(nullptr), hash(0), next(nullptr) { 01635 } 01636 ~NSOverride(); 01637 }; 01638 01643 const SharedNumberFormat **fSharedNumberFormatters = nullptr; 01644 01652 const number::SimpleNumberFormatter* fSimpleNumberFormatter = nullptr; 01653 01654 UBool fHaveDefaultCentury; 01655 01656 const BreakIterator* fCapitalizationBrkIter = nullptr; 01657 }; 01658 01659 inline UDate 01660 SimpleDateFormat::get2DigitYearStart(UErrorCode& /*status*/) const 01661 { 01662 return fDefaultCenturyStart; 01663 } 01664 01665 U_NAMESPACE_END 01666 01667 #endif /* #if !UCONFIG_NO_FORMATTING */ 01668 01669 #endif /* U_SHOW_CPLUSPLUS_API */ 01670 01671 #endif // _SMPDTFMT 01672 //eof
1.7.6.1