Last active
September 1, 2017 14:06
-
-
Save dannylagrouw/12f7a425363221a870a9a7471bdfd327 to your computer and use it in GitHub Desktop.
Parse Dutch written date
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
"use strict"; | |
function findMonth(s) { | |
var MONTHS = ['januari', 'februari', 'maart', 'april', | |
'mei', 'juni', 'juli', 'augustus', 'september', | |
'oktober', 'november', 'december']; | |
return MONTHS.reduce(function (result, month, index) { | |
var i = s.indexOf(month); | |
if (i >= 0) { | |
return [month, index, i]; | |
} | |
else { | |
return result; | |
} | |
}, undefined); | |
} | |
function parseNumberBelow100(s) { | |
var NUMBERS = ['een', 'twee', 'drie', 'vier', 'vijf', 'zes', 'zeven', 'acht', 'negen', 'tien', | |
'elf', 'twaalf', 'dertien', 'veertien', 'vijftien', | |
'zestien', 'zeventien', 'achttien', 'negentien']; | |
var UNITS = ['een', 'twee', 'drie', 'vier', 'vijf', 'zes', 'zeven', 'acht', 'negen']; | |
var TENS = ['twintig', 'dertig', 'veertig', 'vijftig', 'zestig', 'zeventig', | |
'tachtig', 'negentig']; | |
var index = NUMBERS.indexOf(s); | |
if (index >= 0) { | |
return index + 1; | |
} | |
index = TENS.findIndex(function (ten) { return s === ten; }); | |
if (index >= 0) { | |
return (index + 2) * 10; | |
} | |
index = TENS.reduce(function (result, ten, tenIndex) { | |
var unitIndex = UNITS.findIndex(function (unit) { return s === unit + 'en' + ten; }); | |
if (unitIndex >= 0) { | |
return (tenIndex + 2) * 10 + (unitIndex + 1); | |
} | |
else { | |
return result; | |
} | |
}, undefined); | |
return index; | |
} | |
function parseDay(s) { | |
return parseNumberBelow100(s); | |
} | |
function parseYear(s) { | |
var hundreds = 0; | |
var thousands = 0; | |
var restIndex = -1; | |
var rest = 0; | |
var index100 = s.indexOf('honderd'); | |
if (index100 === 0) { | |
hundreds = 1; | |
} | |
else if (index100 > 0) { | |
hundreds = parseNumberBelow100(s.substring(0, index100)); | |
} | |
else { | |
var index1000 = s.indexOf('duizend'); | |
if (index1000 === 0) { | |
thousands = 1; | |
} | |
else if (index1000 > 0) { | |
thousands = parseNumberBelow100(s.substring(0, index1000)); | |
} | |
} | |
if (index100 >= 0) { | |
restIndex = index100 + 7; | |
} | |
else if (index1000 >= 0) { | |
restIndex = index1000 + 7; | |
} | |
if (restIndex !== -1 && restIndex < s.length) { | |
rest = parseNumberBelow100(s.substring(restIndex).trim()); | |
} | |
return (thousands * 1000) + (hundreds * 100) + rest; | |
} | |
function parseDate(s) { | |
var monthInfo = findMonth(s); | |
if (monthInfo) { | |
var monthStr = monthInfo[0], month = monthInfo[1], monthPos = monthInfo[2]; | |
var dayStr = s.substring(0, monthPos).trim(); | |
var day = parseDay(dayStr); | |
var yearStr = s.substring(monthPos + monthStr.length).trim(); | |
var year = parseYear(yearStr); | |
} | |
return new Date(year, month, day); | |
} | |
console.log(parseDate('negenentwintig oktober negentienhonderdvierenzeventig').toString()); | |
console.log(parseDate('twaalf januari negentienhonderd').toString()); | |
console.log(parseDate('eenendertig maart tweeduizend veertien').toString()); | |
console.log(parseDate('drie december tweeduizend').toString()); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment