spreadsheet
typeScript/javascript spreadsheet parser, with formulas.
git clone https://git.vogt.world/spreadsheet.git
Log | Files | README.md
← Commit log
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