summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2016-06-15 12:36:55 +0200
committerEike Rathke <erack@redhat.com>2016-06-15 10:57:57 +0000
commitbe710eef2f8e408b38d8a90aee5c45e2d1a936a2 (patch)
treef9abc77c630dcc18e28a21598d4d2d8ae34a0196
parentabca482aebeb01d516816b543a07edc1dd178240 (diff)
Resolves: tdf#100396 handle unspecified WEEKDAY arguments and support new ones
... introduced with Excel 2010. Change-Id: Ide47fea0e8bc109dc47f591c33ec1d1a13c08d72 (cherry picked from commit d9911e0d13c96feb0b0d1feacef6be7be29ccfe1) Reviewed-on: https://gerrit.libreoffice.org/26297 Reviewed-by: Eike Rathke <erack@redhat.com> Tested-by: Eike Rathke <erack@redhat.com>
-rw-r--r--sc/source/core/tool/interpr2.cxx36
1 files changed, 28 insertions, 8 deletions
diff --git a/sc/source/core/tool/interpr2.cxx b/sc/source/core/tool/interpr2.cxx
index b0d8f6d13190..773eabae412f 100644
--- a/sc/source/core/tool/interpr2.cxx
+++ b/sc/source/core/tool/interpr2.cxx
@@ -196,16 +196,36 @@ void ScInterpreter::ScGetDayOfWeek()
Date aDate = *(pFormatter->GetNullDate());
aDate += (long)::rtl::math::approxFloor(GetDouble());
- int nVal = (int) aDate.GetDayOfWeek();
- if (nFlag == 1)
+ int nVal = (int) aDate.GetDayOfWeek(); // MONDAY = 0
+ switch (nFlag)
{
- if (nVal == 6)
- nVal = 1;
- else
- nVal += 2;
+ case 1: // Sunday = 1
+ if (nVal == 6)
+ nVal = 1;
+ else
+ nVal += 2;
+ break;
+ case 2: // Monday = 1
+ nVal += 1;
+ break;
+ case 3: // Monday = 0
+ ; // nothing
+ break;
+ case 11: // Monday = 1
+ case 12: // Tuesday = 1
+ case 13: // Wednesday = 1
+ case 14: // Thursday = 1
+ case 15: // Friday = 1
+ case 16: // Saturday = 1
+ case 17: // Sunday = 1
+ if (nVal < nFlag - 11) // x = nFlag - 11 = 0,1,2,3,4,5,6
+ nVal += 19 - nFlag; // nVal += (8 - (nFlag - 11) = 8 - x = 8,7,6,5,4,3,2)
+ else
+ nVal -= nFlag - 12; // nVal -= ((nFlag - 11) - 1 = x - 1 = -1,0,1,2,3,4,5)
+ break;
+ default:
+ SetError( errIllegalArgument);
}
- else if (nFlag == 2)
- nVal += 1;
PushInt( nVal );
}
}