commit
message
Working on regex for parsing '2012/1/23' date strings
author
Ben Vogt <[email protected]>
date
2017-02-26 20:35:34
stats
3 file(s) changed,
51 insertions(+),
7 deletions(-)
files
src/RawFormulas/Date.ts
src/RawFormulas/Utils.ts
tests/FormulasTest.ts
1diff --git a/src/RawFormulas/Date.ts b/src/RawFormulas/Date.ts
2index 9b1e8f2..82e8da4 100644
3--- a/src/RawFormulas/Date.ts
4+++ b/src/RawFormulas/Date.ts
5@@ -2,7 +2,9 @@
6 import * as moment from "moment";
7 import * as Formula from "formulajs"
8 import {
9- ArgsChecker, TypeCaster
10+ ArgsChecker,
11+ RegExUtil,
12+ TypeCaster
13 } from "./Utils";
14 import {
15 NUM_ERROR,
16@@ -46,12 +48,11 @@ var DATE = function (...values) {
17 var DATEVALUE = function (...values) : number {
18 ArgsChecker.checkLength(values, 1);
19 var dateString = TypeCaster.firstValueAsString(values[0]);
20- var format = "M/D/Y";
21 var dateNumber;
22- if (false) { // Check "2012/1/23"
23-
24- } if (dateString.match(/^\s*([1-9]|0[1-9]|1[0-2])\/([1-9]|[0-2][0-9]|3[0-1])\/([1-9][0-9][0-9][0-9])\s*$/)) { // Check "1/23/2012"
25- dateNumber = new ExcelDate(moment(dateString, format)).toNumber();
26+ if (RegExUtil.matchDateStringYearMonthDaySlash(dateString)) { // Check "2012/1/23"
27+ dateNumber = new ExcelDate(moment(dateString, "Y/M/D")).toNumber();
28+ } if (RegExUtil.matchDateStringMonthDayYearSlash(dateString)) { // Check "1/23/2012"
29+ dateNumber = new ExcelDate(moment(dateString, "M/D/Y")).toNumber();
30 }
31 if (dateNumber === undefined) {
32 // TODO: Throw error that we couldn't parse the dateString.
33diff --git a/src/RawFormulas/Utils.ts b/src/RawFormulas/Utils.ts
34index be342ec..40d8f24 100644
35--- a/src/RawFormulas/Utils.ts
36+++ b/src/RawFormulas/Utils.ts
37@@ -363,10 +363,48 @@ class Serializer {
38 }
39 }
40
41+/**
42+ * Static class to hold methods for parsing date-like strings.
43+ */
44+class RegExUtil {
45+ private static MONTH_DAY_YEAR_SLASH_REGEX = /^\s*([1-9]|0[1-9]|1[0-2])\/([1-9]|[0-2][0-9]|3[0-1])\/([1-9][0-9][0-9][0-9])\s*$/;
46+ private static DAY_MONTH_YEAR_SLASH_REGEX = /^\s*([1-9]|[0-2][0-9]|3[0-1])\/([1-9]|0[1-9]|1[0-2])\/([1-9][0-9][0-9][0-9])\s*$/;
47+ private static YEAR_MONTH_DAY_SLASH_REGEX = /^\s*([1-9][0-9][0-9][0-9])\/([1-9]|0[1-9]|1[0-2])\/([1-9]|[0-2][0-9]|3[0-1])\s*$/;
48+
49+ /**
50+ * Match dates in the form "mm/dd/yyyy" or "m/d/yyyy".
51+ * @param dateString to match
52+ * @returns {RegExpMatchArray} matches or null.
53+ */
54+ static matchDateStringMonthDayYearSlash(dateString : string) : RegExpMatchArray | null {
55+ return dateString.match(this.MONTH_DAY_YEAR_SLASH_REGEX);
56+ }
57+
58+ /**
59+ * Match dates in the form "dd/mm/yyyy" or "d/m/yyyy".
60+ * @param dateString to match
61+ * @returns {RegExpMatchArray} matches or null
62+ */
63+ static matchDateStringDayMonthYearSlash(dateString : string) : RegExpMatchArray | null {
64+ return dateString.match(this.DAY_MONTH_YEAR_SLASH_REGEX);
65+ }
66+
67+ /**
68+ * Match dates in the form "yyyy/mm/dd" or "yyyy/mm/dd".
69+ * @param dateString to match
70+ * @returns {RegExpMatchArray} matches or null
71+ */
72+ static matchDateStringYearMonthDaySlash(dateString : string) : RegExpMatchArray | null {
73+ return dateString.match(this.YEAR_MONTH_DAY_SLASH_REGEX);
74+ }
75+
76+}
77+
78 export {
79 ArgsChecker,
80 CriteriaFunctionFactory,
81 Filter,
82+ RegExUtil,
83 Serializer,
84 TypeCaster
85 }
86\ No newline at end of file
87diff --git a/tests/FormulasTest.ts b/tests/FormulasTest.ts
88index 994f8d1..591a813 100644
89--- a/tests/FormulasTest.ts
90+++ b/tests/FormulasTest.ts
91@@ -778,6 +778,10 @@ assertEquals(DATE(2004, 3, 1).toNumber(), 38047);
92
93 // Test DATEVALUE
94 assertEquals(DATEVALUE("6/24/1992"), 33779);
95+assertEquals(DATEVALUE("06/24/1992"), 33779);
96+assertEquals(DATEVALUE("1992/6/24"), 33779);
97+assertEquals(DATEVALUE("1992/06/24"), 33779);
98+
99
100
101 // Test DB