Kaydet (Commit) 9fdba37e authored tarafından Eike Rathke's avatar Eike Rathke Kaydeden (comit) Andras Timar

Resolves: tdf#93080 short day name and month name may interfere

Change-Id: I088633e4cff278e1add8eeea8828f9ba9c9fb140
(cherry picked from commit c7d66949)
Reviewed-on: https://gerrit.libreoffice.org/17545Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarCaolán McNamara <caolanm@redhat.com>
Tested-by: 's avatarCaolán McNamara <caolanm@redhat.com>
üst c7565c7c
......@@ -110,6 +110,7 @@ void ImpSvNumberInputScan::Reset()
{
nMonth = 0;
nMonthPos = 0;
nDayOfWeek = 0;
nTimePos = 0;
nSign = 0;
nESign = 0;
......@@ -2100,6 +2101,33 @@ bool ImpSvNumberInputScan::ScanStartString( const OUString& rString,
{
const sal_Int32 nMonthStart = nPos;
short nTempMonth = GetMonth(rString, nPos);
if (nTempMonth < 0)
{
// Short month and day names may be identical in some locales, e.g.
// "mar" for "martes" or "marzo" in Spanish.
// Do not let a month name immediately take precedence if a day
// name was meant instead. Assume that both could be valid, until
// encountered differently or the final evaluation in
// IsNumberFormat() checks, but continue with weighing the month
// name higher unless we have both day of week and month name here.
sal_Int32 nTempPos = nMonthStart;
nDayOfWeek = GetDayOfWeek( rString, nTempPos);
if (nDayOfWeek < 0)
{
SkipChar( '.', rString, nTempPos ); // abbreviated
SkipString( pFormatter->GetLocaleData()->getLongDateDayOfWeekSep(), rString, nTempPos );
SkipBlanks( rString, nTempPos);
short nTempTempMonth = GetMonth( rString, nTempPos);
if (nTempTempMonth)
{
// Fall into the else branch below that handles both.
nTempMonth = 0;
nPos = nMonthStart;
nDayOfWeek = 0;
// Do not set nDayOfWeek hereafter, anywhere.
}
}
}
if ( nTempMonth ) // month (Jan 1)?
{
// Jan1 without separator is not a date, unless it is followed by a
......@@ -2122,14 +2150,14 @@ bool ImpSvNumberInputScan::ScanStartString( const OUString& rString,
}
else
{
int nDayOfWeek = GetDayOfWeek( rString, nPos );
if ( nDayOfWeek )
int nTempDayOfWeek = GetDayOfWeek( rString, nPos );
if ( nTempDayOfWeek )
{
// day of week is just parsed away
eScannedType = css::util::NumberFormat::DATE; // !!! it IS a date !!!
if ( nPos < rString.getLength() )
{
if ( nDayOfWeek < 0 )
if ( nTempDayOfWeek < 0 )
{
// abbreviated
if ( rString[ nPos ] == (sal_Unicode)'.' )
......@@ -2805,12 +2833,12 @@ bool ImpSvNumberInputScan::ScanEndString( const OUString& rString,
nPos = nPos + rSep.getLength();
SkipBlanks(rString, nPos);
}
int nDayOfWeek = GetDayOfWeek( rString, nPos );
if ( nDayOfWeek )
int nTempDayOfWeek = GetDayOfWeek( rString, nPos );
if ( nTempDayOfWeek )
{
if ( nPos < rString.getLength() )
{
if ( nDayOfWeek < 0 )
if ( nTempDayOfWeek < 0 )
{ // short
if ( rString[ nPos ] == (sal_Unicode)'.' )
{
......@@ -3501,6 +3529,14 @@ bool ImpSvNumberInputScan::IsNumberFormat( const OUString& rString, // s
break;
case css::util::NumberFormat::DATE:
if (nMonth < 0 && nDayOfWeek < 0 && nAnzNums == 3)
{
// If both, short month name and day of week name were
// detected, and also numbers for full date, assume that we
// have a day of week instead of month name.
nMonth = 0;
nMonthPos = 0;
}
if (nMonth)
{ // month name and numbers
if (nAnzNums > 2)
......@@ -3547,6 +3583,15 @@ bool ImpSvNumberInputScan::IsNumberFormat( const OUString& rString, // s
break;
case css::util::NumberFormat::DATETIME:
if (nMonth < 0 && nDayOfWeek < 0 && nAnzNums >= 5)
{
// If both, abbreviated month name and day of week name
// were detected, and also at least numbers for full date
// plus time including minutes, assume that we have a day
// of week instead of month name.
nMonth = 0;
nMonthPos = 0;
}
if (nMonth)
{ // month name and numbers
if (nDecPos)
......
......@@ -108,6 +108,7 @@ private:
// negative => short format
short nMonthPos; // 1 = front, 2 = middle
// 3 = end
int nDayOfWeek; // Temporary (!) day of week (1..7,-1..-7) if date
sal_uInt16 nTimePos; // Index of first time separator (+1)
short nDecPos; // Index of substring containing "," (+1)
short nNegCheck; // '( )' for negative
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment