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() ...@@ -110,6 +110,7 @@ void ImpSvNumberInputScan::Reset()
{ {
nMonth = 0; nMonth = 0;
nMonthPos = 0; nMonthPos = 0;
nDayOfWeek = 0;
nTimePos = 0; nTimePos = 0;
nSign = 0; nSign = 0;
nESign = 0; nESign = 0;
...@@ -2100,6 +2101,33 @@ bool ImpSvNumberInputScan::ScanStartString( const OUString& rString, ...@@ -2100,6 +2101,33 @@ bool ImpSvNumberInputScan::ScanStartString( const OUString& rString,
{ {
const sal_Int32 nMonthStart = nPos; const sal_Int32 nMonthStart = nPos;
short nTempMonth = GetMonth(rString, 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)? if ( nTempMonth ) // month (Jan 1)?
{ {
// Jan1 without separator is not a date, unless it is followed by a // Jan1 without separator is not a date, unless it is followed by a
...@@ -2122,14 +2150,14 @@ bool ImpSvNumberInputScan::ScanStartString( const OUString& rString, ...@@ -2122,14 +2150,14 @@ bool ImpSvNumberInputScan::ScanStartString( const OUString& rString,
} }
else else
{ {
int nDayOfWeek = GetDayOfWeek( rString, nPos ); int nTempDayOfWeek = GetDayOfWeek( rString, nPos );
if ( nDayOfWeek ) if ( nTempDayOfWeek )
{ {
// day of week is just parsed away // day of week is just parsed away
eScannedType = css::util::NumberFormat::DATE; // !!! it IS a date !!! eScannedType = css::util::NumberFormat::DATE; // !!! it IS a date !!!
if ( nPos < rString.getLength() ) if ( nPos < rString.getLength() )
{ {
if ( nDayOfWeek < 0 ) if ( nTempDayOfWeek < 0 )
{ {
// abbreviated // abbreviated
if ( rString[ nPos ] == (sal_Unicode)'.' ) if ( rString[ nPos ] == (sal_Unicode)'.' )
...@@ -2805,12 +2833,12 @@ bool ImpSvNumberInputScan::ScanEndString( const OUString& rString, ...@@ -2805,12 +2833,12 @@ bool ImpSvNumberInputScan::ScanEndString( const OUString& rString,
nPos = nPos + rSep.getLength(); nPos = nPos + rSep.getLength();
SkipBlanks(rString, nPos); SkipBlanks(rString, nPos);
} }
int nDayOfWeek = GetDayOfWeek( rString, nPos ); int nTempDayOfWeek = GetDayOfWeek( rString, nPos );
if ( nDayOfWeek ) if ( nTempDayOfWeek )
{ {
if ( nPos < rString.getLength() ) if ( nPos < rString.getLength() )
{ {
if ( nDayOfWeek < 0 ) if ( nTempDayOfWeek < 0 )
{ // short { // short
if ( rString[ nPos ] == (sal_Unicode)'.' ) if ( rString[ nPos ] == (sal_Unicode)'.' )
{ {
...@@ -3501,6 +3529,14 @@ bool ImpSvNumberInputScan::IsNumberFormat( const OUString& rString, // s ...@@ -3501,6 +3529,14 @@ bool ImpSvNumberInputScan::IsNumberFormat( const OUString& rString, // s
break; break;
case css::util::NumberFormat::DATE: 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) if (nMonth)
{ // month name and numbers { // month name and numbers
if (nAnzNums > 2) if (nAnzNums > 2)
...@@ -3547,6 +3583,15 @@ bool ImpSvNumberInputScan::IsNumberFormat( const OUString& rString, // s ...@@ -3547,6 +3583,15 @@ bool ImpSvNumberInputScan::IsNumberFormat( const OUString& rString, // s
break; break;
case css::util::NumberFormat::DATETIME: 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) if (nMonth)
{ // month name and numbers { // month name and numbers
if (nDecPos) if (nDecPos)
......
...@@ -108,6 +108,7 @@ private: ...@@ -108,6 +108,7 @@ private:
// negative => short format // negative => short format
short nMonthPos; // 1 = front, 2 = middle short nMonthPos; // 1 = front, 2 = middle
// 3 = end // 3 = end
int nDayOfWeek; // Temporary (!) day of week (1..7,-1..-7) if date
sal_uInt16 nTimePos; // Index of first time separator (+1) sal_uInt16 nTimePos; // Index of first time separator (+1)
short nDecPos; // Index of substring containing "," (+1) short nDecPos; // Index of substring containing "," (+1)
short nNegCheck; // '( )' for negative 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