tdf#101147 Improve (again) minute/month detection
For format like HH:MM:SS MM/DD second MM is detected as minute: see tdf#95339 New rules: - first M following each H is minute - first M following first S is minute Detection Month/minute now fully compatible with Excel even with unwanted detection: SS:MM:HH DD/MM/YY second MM is minute even if user would expect month Change-Id: Ia789fbc2dbd6d2dcbe9b9c34d3f288674966dd10 Reviewed-on: https://gerrit.libreoffice.org/27560 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Eike Rathke <erack@redhat.com> Tested-by: Eike Rathke <erack@redhat.com>
This commit is contained in:
committed by
Eike Rathke
parent
0db0fda5a1
commit
aa6bca0dfa
@@ -1132,8 +1132,8 @@ void Test::testUserDefinedNumberFormats()
|
|||||||
checkPreviewString(aFormatter, sCode, -12.0, eLang, sExpected);
|
checkPreviewString(aFormatter, sCode, -12.0, eLang, sExpected);
|
||||||
}
|
}
|
||||||
{ // tdf#995339: detect SSMM as second minute
|
{ // tdf#995339: detect SSMM as second minute
|
||||||
sCode = "SS:MM:HH DD/MM/YY";
|
sCode = "SS:MM:HH DD/MM/YY"; // Month not detected by Excel, so we do not neither to keep compatibility
|
||||||
sExpected = "54:23:03 02/01/00";
|
sExpected = "54:23:03 02/23/00";
|
||||||
checkPreviewString(aFormatter, sCode, M_PI, eLang, sExpected);
|
checkPreviewString(aFormatter, sCode, M_PI, eLang, sExpected);
|
||||||
}
|
}
|
||||||
{ // tdf#99996: better algorithm for fraction representation
|
{ // tdf#99996: better algorithm for fraction representation
|
||||||
|
@@ -1121,6 +1121,8 @@ sal_Int32 ImpSvNumberformatScan::ScanType()
|
|||||||
short eNewType;
|
short eNewType;
|
||||||
bool bMatchBracket = false;
|
bool bMatchBracket = false;
|
||||||
bool bHaveGeneral = false; // if General/Standard encountered
|
bool bHaveGeneral = false; // if General/Standard encountered
|
||||||
|
bool bIsTimeDetected =false; // hour or second found in format
|
||||||
|
bool bHaveMinute = false;
|
||||||
|
|
||||||
SkipStrings(i, nPos);
|
SkipStrings(i, nPos);
|
||||||
while (i < nAnzStrings)
|
while (i < nAnzStrings)
|
||||||
@@ -1135,20 +1137,26 @@ sal_Int32 ImpSvNumberformatScan::ScanType()
|
|||||||
case NF_KEY_E: // E
|
case NF_KEY_E: // E
|
||||||
eNewType = css::util::NumberFormat::SCIENTIFIC;
|
eNewType = css::util::NumberFormat::SCIENTIFIC;
|
||||||
break;
|
break;
|
||||||
case NF_KEY_AMPM: // AM,A,PM,P
|
|
||||||
case NF_KEY_AP:
|
|
||||||
case NF_KEY_H: // H
|
case NF_KEY_H: // H
|
||||||
case NF_KEY_HH: // HH
|
case NF_KEY_HH: // HH
|
||||||
|
bIsTimeDetected = true;
|
||||||
|
SAL_FALLTHROUGH;
|
||||||
case NF_KEY_S: // S
|
case NF_KEY_S: // S
|
||||||
case NF_KEY_SS: // SS
|
case NF_KEY_SS: // SS
|
||||||
|
if ( !bHaveMinute )
|
||||||
|
bIsTimeDetected = true;
|
||||||
|
SAL_FALLTHROUGH;
|
||||||
|
case NF_KEY_AMPM: // AM,A,PM,P
|
||||||
|
case NF_KEY_AP:
|
||||||
eNewType = css::util::NumberFormat::TIME;
|
eNewType = css::util::NumberFormat::TIME;
|
||||||
break;
|
break;
|
||||||
case NF_KEY_M: // M
|
case NF_KEY_M: // M
|
||||||
case NF_KEY_MM: // MM
|
case NF_KEY_MM: // MM
|
||||||
/* Minute or month.
|
/* Minute or month.
|
||||||
Minute if one of:
|
Minute if one of:
|
||||||
* preceded by time keyword H or S (ignoring separators)
|
* preceded by time keyword H (ignoring separators)
|
||||||
* followed by time keyword S (ignoring separators)
|
* followed by time keyword S (ignoring separators)
|
||||||
|
* H or S was detected
|
||||||
* preceded by '[' amount bracket
|
* preceded by '[' amount bracket
|
||||||
Else month.
|
Else month.
|
||||||
*/
|
*/
|
||||||
@@ -1156,14 +1164,15 @@ sal_Int32 ImpSvNumberformatScan::ScanType()
|
|||||||
nIndexNex = NextKeyword(i);
|
nIndexNex = NextKeyword(i);
|
||||||
if (nIndexPre == NF_KEY_H || // H
|
if (nIndexPre == NF_KEY_H || // H
|
||||||
nIndexPre == NF_KEY_HH || // HH
|
nIndexPre == NF_KEY_HH || // HH
|
||||||
nIndexPre == NF_KEY_S || // S before M tdf#95339
|
|
||||||
nIndexPre == NF_KEY_SS || // SS
|
|
||||||
nIndexNex == NF_KEY_S || // S
|
nIndexNex == NF_KEY_S || // S
|
||||||
nIndexNex == NF_KEY_SS || // SS
|
nIndexNex == NF_KEY_SS || // SS
|
||||||
|
bIsTimeDetected || // tdf#101147
|
||||||
PreviousChar(i) == '[' ) // [M
|
PreviousChar(i) == '[' ) // [M
|
||||||
{
|
{
|
||||||
eNewType = css::util::NumberFormat::TIME;
|
eNewType = css::util::NumberFormat::TIME;
|
||||||
nTypeArray[i] -= 2; // 6 -> 4, 7 -> 5
|
nTypeArray[i] -= 2; // 6 -> 4, 7 -> 5
|
||||||
|
bIsTimeDetected = false; // next M should be month
|
||||||
|
bHaveMinute = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user