fOverrideList(NULL),
fCapitalizationContext(UDISPCTX_CAPITALIZATION_NONE)
{
- setBooleanAttribute(UDAT_PARSE_ALLOW_WHITESPACE, true, status).setBooleanAttribute(UDAT_PARSE_ALLOW_NUMERIC, true, status);
+ setBooleanAttribute(UDAT_PARSE_ALLOW_WHITESPACE, true, status).setBooleanAttribute(UDAT_PARSE_ALLOW_NUMERIC, true, status).setBooleanAttribute(UDAT_PARSE_PARTIAL_MATCH, true, status);
construct(kShort, (EStyle) (kShort + kDateOffset), fLocale, status);
initializeDefaultCentury();
}
{
fDateOverride.setToBogus();
fTimeOverride.setToBogus();
- setBooleanAttribute(UDAT_PARSE_ALLOW_WHITESPACE, true, status).setBooleanAttribute(UDAT_PARSE_ALLOW_NUMERIC, true, status);
+ setBooleanAttribute(UDAT_PARSE_ALLOW_WHITESPACE, true, status).setBooleanAttribute(UDAT_PARSE_ALLOW_NUMERIC, true, status).setBooleanAttribute(UDAT_PARSE_PARTIAL_MATCH, true, status);
initializeSymbols(fLocale, initializeCalendar(NULL,fLocale,status), status);
initialize(fLocale, status);
initializeDefaultCentury();
{
fDateOverride.setTo(override);
fTimeOverride.setToBogus();
- setBooleanAttribute(UDAT_PARSE_ALLOW_WHITESPACE, true, status).setBooleanAttribute(UDAT_PARSE_ALLOW_NUMERIC, true, status);
+ setBooleanAttribute(UDAT_PARSE_ALLOW_WHITESPACE, true, status).setBooleanAttribute(UDAT_PARSE_ALLOW_NUMERIC, true, status).setBooleanAttribute(UDAT_PARSE_PARTIAL_MATCH, true, status);
initializeSymbols(fLocale, initializeCalendar(NULL,fLocale,status), status);
initialize(fLocale, status);
initializeDefaultCentury();
fDateOverride.setToBogus();
fTimeOverride.setToBogus();
- setBooleanAttribute(UDAT_PARSE_ALLOW_WHITESPACE, true, status).setBooleanAttribute(UDAT_PARSE_ALLOW_NUMERIC, true, status);
+ setBooleanAttribute(UDAT_PARSE_ALLOW_WHITESPACE, true, status).setBooleanAttribute(UDAT_PARSE_ALLOW_NUMERIC, true, status).setBooleanAttribute(UDAT_PARSE_PARTIAL_MATCH, true, status);
initializeSymbols(fLocale, initializeCalendar(NULL,fLocale,status), status);
initialize(fLocale, status);
fDateOverride.setTo(override);
fTimeOverride.setToBogus();
- setBooleanAttribute(UDAT_PARSE_ALLOW_WHITESPACE, true, status).setBooleanAttribute(UDAT_PARSE_ALLOW_NUMERIC, true, status);
+ setBooleanAttribute(UDAT_PARSE_ALLOW_WHITESPACE, true, status).setBooleanAttribute(UDAT_PARSE_ALLOW_NUMERIC, true, status).setBooleanAttribute(UDAT_PARSE_PARTIAL_MATCH, true, status);
initializeSymbols(fLocale, initializeCalendar(NULL,fLocale,status), status);
initialize(fLocale, status);
fDateOverride.setToBogus();
fTimeOverride.setToBogus();
- setBooleanAttribute(UDAT_PARSE_ALLOW_WHITESPACE, true, status).setBooleanAttribute(UDAT_PARSE_ALLOW_NUMERIC, true, status);
+ setBooleanAttribute(UDAT_PARSE_ALLOW_WHITESPACE, true, status).setBooleanAttribute(UDAT_PARSE_ALLOW_NUMERIC, true, status).setBooleanAttribute(UDAT_PARSE_PARTIAL_MATCH, true, status);
initializeCalendar(NULL,fLocale,status);
initialize(fLocale, status);
fDateOverride.setToBogus();
fTimeOverride.setToBogus();
- setBooleanAttribute(UDAT_PARSE_ALLOW_WHITESPACE, true, status).setBooleanAttribute(UDAT_PARSE_ALLOW_NUMERIC, true, status);
+ setBooleanAttribute(UDAT_PARSE_ALLOW_WHITESPACE, true, status).setBooleanAttribute(UDAT_PARSE_ALLOW_NUMERIC, true, status).setBooleanAttribute(UDAT_PARSE_PARTIAL_MATCH, true, status);
initializeCalendar(NULL, fLocale, status);
initialize(fLocale, status);
fOverrideList(NULL),
fCapitalizationContext(UDISPCTX_CAPITALIZATION_NONE)
{
- setBooleanAttribute(UDAT_PARSE_ALLOW_WHITESPACE, true, status).setBooleanAttribute(UDAT_PARSE_ALLOW_NUMERIC, true, status);
+ setBooleanAttribute(UDAT_PARSE_ALLOW_WHITESPACE, true, status).setBooleanAttribute(UDAT_PARSE_ALLOW_NUMERIC, true, status).setBooleanAttribute(UDAT_PARSE_PARTIAL_MATCH, true, status);
construct(timeStyle, dateStyle, fLocale, status);
if(U_SUCCESS(status)) {
initializeDefaultCentury();
fDateOverride.setToBogus();
fTimeOverride.setToBogus();
- setBooleanAttribute(UDAT_PARSE_ALLOW_WHITESPACE, true, status).setBooleanAttribute(UDAT_PARSE_ALLOW_NUMERIC, true, status);
+ setBooleanAttribute(UDAT_PARSE_ALLOW_WHITESPACE, true, status).setBooleanAttribute(UDAT_PARSE_ALLOW_NUMERIC, true, status).setBooleanAttribute(UDAT_PARSE_PARTIAL_MATCH, true, status);
initialize(fLocale, status);
if(U_SUCCESS(status)) {
fCapitalizationContext(UDISPCTX_CAPITALIZATION_NONE)
{
UErrorCode status = U_ZERO_ERROR;
- setBooleanAttribute(UDAT_PARSE_ALLOW_WHITESPACE, true, status).setBooleanAttribute(UDAT_PARSE_ALLOW_NUMERIC, true, status);
+ setBooleanAttribute(UDAT_PARSE_ALLOW_WHITESPACE, true, status).setBooleanAttribute(UDAT_PARSE_ALLOW_NUMERIC, true, status).setBooleanAttribute(UDAT_PARSE_PARTIAL_MATCH, true, status);
*this = other;
}
abutPat = -1; // End of any abutting fields
- if (! matchLiterals(fPattern, i, text, pos, getBooleanAttribute(UDAT_PARSE_ALLOW_WHITESPACE, status))) {
+ if (! matchLiterals(fPattern, i, text, pos, getBooleanAttribute(UDAT_PARSE_ALLOW_WHITESPACE, status), getBooleanAttribute(UDAT_PARSE_PARTIAL_MATCH, status))) {
status = U_PARSE_ERROR;
goto ExitParse;
}
int32_t &patternOffset,
const UnicodeString &text,
int32_t &textOffset,
- UBool lenient)
+ UBool whitespaceLenient,
+ UBool partialMatchLenient)
{
UBool inQuote = FALSE;
UnicodeString literal;
int32_t p;
int32_t t = textOffset;
- if (lenient) {
+ if (whitespaceLenient) {
// trim leading, trailing whitespace from
// the literal text
literal.trim();
// TODO: should we require internal spaces
// in lenient mode? (There won't be any
// leading or trailing spaces)
- if (!lenient && t == tStart) {
+ if (!whitespaceLenient && t == tStart) {
// didn't find matching whitespace:
// an error in strict mode
return FALSE;
if (t >= text.length() || literal.charAt(p) != text.charAt(t)) {
// Ran out of text, or found a non-matching character:
// OK in lenient mode, an error in strict mode.
- if (lenient) {
+ if (partialMatchLenient) {
if (t == textOffset && text.charAt(t) == 0x2e &&
isAfterNonNumericField(pattern, patternOffset)) {
// Lenient mode and the literal input text begins with a "." and
/********************************************************************
* COPYRIGHT:
- * Copyright (c) 1997-2012, International Business Machines Corporation and
+ * Copyright (c) 1997-2013, International Business Machines Corporation and
* others. All Rights Reserved.
********************************************************************/
CASE(26,Test5554)
CASE(27,Test9237)
CASE(28,TestParsing)
+ CASE(29,TestT10334)
default: name = ""; break;
}
}
delete cal;
}
+void DateFormatRegressionTest::TestT10334(void) {
+ UErrorCode status = U_ZERO_ERROR;
+ UnicodeString pattern("'--: 'EEE-WW-MMMM-yyyy");
+ UnicodeString text("--mon-02-march-2011");
+ SimpleDateFormat format(pattern, status);
+
+ format.setBooleanAttribute(UDAT_PARSE_PARTIAL_MATCH, FALSE, status);
+ format.parse(text, status);
+ if (!U_FAILURE(status)) {
+ errln("parse partial match did NOT fail in strict mode", u_errorName(status));
+ }
+
+ status = U_ZERO_ERROR;
+ format.setBooleanAttribute(UDAT_PARSE_PARTIAL_MATCH, TRUE, status);
+ format.parse(text, status);
+ if (U_FAILURE(status)) {
+ errln("parse partial match failure in lenient mode", u_errorName(status));
+ }
+
+ status = U_ZERO_ERROR;
+ pattern = UnicodeString("YYYY MM dd");
+ text = UnicodeString("2013 12 10");
+ format.applyPattern(pattern);
+ UDate referenceDate = format.parse(text, status);
+
+ FieldPosition fp(0);
+ UnicodeString formattedString("");
+ pattern = UnicodeString("YYYY LL dd ee cc qq QQ");
+ format.applyPattern(pattern);
+ format.format(referenceDate, formattedString, fp, status);
+ logln("ref date: " + formattedString);
+
+
+ char patternArray[] = "YYYY LLL dd eee ccc qqq QQQ";
+ pattern = UnicodeString(patternArray);
+ text = UnicodeString("2013 12 10 03 3 04 04");
+ status = U_ZERO_ERROR;
+ format.setBooleanAttribute(UDAT_PARSE_ALLOW_NUMERIC, TRUE, status);
+ format.applyPattern(pattern);
+ ParsePosition pp(0);
+ format.parse(text, pp);
+ int32_t errorIdx = pp.getErrorIndex();
+ if (errorIdx != -1) {
+ char buffer[256];
+ _snprintf(buffer, 256, "numeric parse error at[%d] on pattern char[%s]", errorIdx, &patternArray[errorIdx]);
+ errln(buffer);
+ }
+
+ status = U_ZERO_ERROR;
+ format.setBooleanAttribute(UDAT_PARSE_ALLOW_NUMERIC, FALSE, status);
+ format.parse(text, status);
+ if (!U_FAILURE(status)) {
+ errln("numeric parse did NOT fail in strict mode", u_errorName(status));
+ }
+
+}
+
#endif /* #if !UCONFIG_NO_FORMATTING */
//eof