Skip to content

Commit

Permalink
Version 0.1.0
Browse files Browse the repository at this point in the history
Includes English, French and Spanish locales.
  • Loading branch information
nmussy committed Jul 28, 2013
1 parent 17946ea commit dee8a8b
Show file tree
Hide file tree
Showing 6 changed files with 162 additions and 0 deletions.
1 change: 1 addition & 0 deletions bin/readInt.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module.exports = require('../lib/readInt.js');
111 changes: 111 additions & 0 deletions lib/readInt.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
/*
* Copyright 2013 Jimmy Gaussen
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
function readInt(str, locale) {
if(!isNaN(parseInt(str)))
return parseInt(str);

if(typeof locale === 'undefined')
locale = 'en';

var locale = require('../locales/' + locale);
var tokens = tokenizeString(str, locale);


if(tokens.length > 0)
return parseInteger(tokens);
return -1;
};

function parseInteger(tokens) {
if(tokens.length == 0)
return -1;
if(tokens.length == 1)
return tokens[0].value;

var highestLevel = -1;
var highestLevelIndex = -1;
for(var i = 0; i < tokens.length; ++i) {
if(tokens[i].value > highestLevel) {
highestLevel = tokens[i].value;
highestLevelIndex = i;
}
}

var highestLevelValue = tokens[highestLevelIndex].value;
var leftHandValue = parseInteger(tokens.slice(0, highestLevelIndex));
var rightHandValue = parseInteger(tokens.slice(highestLevelIndex + 1, tokens.length));

return (leftHandValue == -1 ? 1 : leftHandValue) * highestLevelValue + (rightHandValue == -1 ? 0 : rightHandValue);
};

function tokenizeString(str, locale) {
var tokens = str.split(locale.splitter);
var keywords = getKeywords(locale.values);

var result = [];
if(typeof locale.filters === 'undefined') {
for(var i = 0; ; ++i) {
if(typeof tokens[i] === 'undefined')
break;

if(tokens[i].length == 0) {
tokens.splice(i--, 1);
continue;
}
for(var j = 0; ; ++j)
if(typeof keywords[j] === 'undefined') {
tokens.splice(i--, 1);
break;
} else if(tokens[i].toLowerCase() == keywords[j].string){
result.push(keywords[j]);
break;
}
}
} else
for(var i = 0; ; ++i) {
if(typeof tokens[i] === 'undefined')
break;

if(tokens[i].length == 0) {
tokens.splice(i--, 1);
continue;
}
tokens[i] = tokens[i].toLowerCase();
for(var j = 0; j < locale.filters.length; ++j)
tokens[i] = tokens[i].replace(locale.filters[j][0], locale.filters[j][1]);
for(var j = 0; ; ++j)
if(typeof keywords[j] === 'undefined') {
tokens.splice(i--, 1);
break;
} else if(tokens[i] == keywords[j].string) {
result.push(keywords[j]);
break;
}
}

return result;
};

function getKeywords (values) {
var keys = [];
for(var i = 0; i < values.length; ++i) {
for(var key in values[i])
keys.push({'string': key, 'value': values[i][key], 'level': i});
}
return keys;
};

module.exports = readInt;
13 changes: 13 additions & 0 deletions locales/en.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
module.exports = {
'splitter' : /\s|\sand/,
'filters' : [[/s$/,''], [/ies$/, 'y']],
'values': [
{"zero": 0, "one": 1, "two": 2, "three": 3, "four": 4, "five": 5, "six": 6, "seven": 7, "eight": 8, "nine": 9, "eleven": 11, "twelve": 12, "thirteen": 13, "fourteen": 14, "fifteen": 15, "sixteen": 16, "seventeen": 17, "eighteen": 18, "nineteen": 19},
{"ten": 10, "twenty": 20, "thirty": 30, "forty": 40, "fifty": 50, "sixty": 60, "seventy": 70, "eighty": 80, "ninety": 90},
{"hundred": 100},
{"thousand": 1000},
{"million": 1000000},
{"billion": 1000000000},
{"trillion": 1000000000000}
]
};
13 changes: 13 additions & 0 deletions locales/es.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
module.exports = {
'splitter' : /\s|\sy/,
'filters' : [[/s$/,''], [/[á]/, 'a'], [/[é]/, 'e'], [/[ú]/, 'u'], [/[ó]/, 'o'], [/[ñ]/, 'n'], [/[í]/, 'i']],
'values': [
{"zero": 0, "uno": 1, "dos": 2, "tres": 3, "cuatro": 4, "cinco": 5, "seis": 6, "siete": 7, "ocho": 8, "nueve": 9, "once": 11, "doze": 12, "trece": 13, "catorce": 14, "quince": 15, "diecisies": 16, "diecisiete": 17, "dieciocho": 18, "diecinueve": 19, "veintiuno": 21, "veintidos": 22, "veintitres": 23, "veinticuatro": 24, "veinticinco": 25, "veintiseis": 26, "veintisiete": 27, "veintiocho": 28, "veintinueve": 29},
{"diez": 10, "veinte": 20, "treinta": 30, "cuarenta": 40, "cicuenta": 50, "sensta": 60, "setenta": 70, "ochenta": 80, "noventa": 90},
{"cien": 100, "ciento": 100, "dosciento": 200, "trescientos": 300, "cuatrocientos": 400, "quinientos": 500, "seiscientos": 600, "setecientos": 700, "ochocientos": 800, "novecientos": 900},
{"mil": 1000},
{"millon": 1000000, "millone": 1000000},
{"billon": 1000000000, "billone": 1000000000},
{"trillon": 1000000000000, "trillone": 1000000000000}
]
};
13 changes: 13 additions & 0 deletions locales/fr.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
module.exports = {
'splitter' : /\s|et|-(?=[^vingt|dix])/,
'filters' : [[/s$/,''], [/[àâ]/, 'a'], [/[êéèë]/, 'e'], [/[ùûûü]/, 'u'], [/[ô]/, 'o'], [/[ç]/, 'c'], [/[îï]/, 'i']],
'values': [
{"zero": 0, "un": 1, "deux": 2, "trois": 3, "quatre": 4, "cinq": 5, "six": 6, "sept": 7, "huit": 8, "neuf": 9, "onze": 11, "douze": 12, "treize": 13, "quatorze": 14, "quinze": 15, "seize": 16},
{"dix": 10, "vingt": 20, "trente": 30, "quarente": 40, "cinquante": 50, "soixante": 60, "soixante-dix": 70, "quatre-vingt": 80, "quatre-vingt-dix": 90},
{"cent": 100},
{"mille": 1000},
{"million": 1000000},
{"milliard": 1000000000},
{"billion": 1000000000000}
]
};
11 changes: 11 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"author": "Jimmy Gaussen",
"name": "readInt",
"description": "Node application for a localized written number parsing",
"version": "0.1.0",
"repository": {
"url": "https://github.com/nmussy/readInt"
},
"main": "./bin/readInt.js",
"keywords": ["written", "number", "parsing", "parse", "integer", "int", "localized", "english", "french"]
}

0 comments on commit dee8a8b

Please sign in to comment.