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 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
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
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;
01231
01240 SimpleDateFormat(EStyle timeStyle, EStyle dateStyle, const Locale& locale, UErrorCode& status);
01241
01250 SimpleDateFormat(const Locale& locale, UErrorCode& status);
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;
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;
01599
01603 TimeZoneFormat* fTimeZoneFormat = nullptr;
01604
01613 UDate fDefaultCenturyStart;
01614
01615 UBool fHasMinute;
01616 UBool fHasSecond;
01617 UBool fHasHanYearChar;
01618
01622 void parsePattern();
01623
01627 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& ) const
01661 {
01662 return fDefaultCenturyStart;
01663 }
01664
01665 U_NAMESPACE_END
01666
01667 #endif
01668
01669 #endif
01670
01671 #endif // _SMPDTFMT
01672