From be64e074f132fdf46179754a4d9e2ca4ef985d88 Mon Sep 17 00:00:00 2001 From: Hans Kristian Flaatten Date: Fri, 6 May 2016 23:53:32 +0200 Subject: [PATCH] feat(parser): more correct number parsing This prevents strings with mixed numbers and strings to be parsed as numbers if the string begins with a number. `123abc` will now evaluate to the string instead of `123` with the previous parser. --- index.js | 3 ++- test.js | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/index.js b/index.js index 51b791e..60a7c3b 100644 --- a/index.js +++ b/index.js @@ -189,7 +189,8 @@ module.exports.prototype.parseStringVal = function(string) { return true; } else if (this.string.toBoolean && string.toLowerCase() === 'false') { return false; - } else if (this.string.toNumber && !isNaN(parseFloat(string, 10))) { + } else if (this.string.toNumber && !isNaN(parseInt(string, 10)) && + (+string - +string + 1) >= 0) { return parseFloat(string, 10); } else { return string; diff --git a/test.js b/test.js index f8e2cba..05f3bfe 100644 --- a/test.js +++ b/test.js @@ -132,6 +132,14 @@ describe('parseStringVal()', function() { assert.equal(qs.parseStringVal('000100'), 100); }); + it('returns number for positive parseable integer', function() { + assert.equal(qs.parseStringVal('+100'), 100); + }); + + it('returns number for negative parseable integer', function() { + assert.equal(qs.parseStringVal('-100'), -100); + }); + it('returns number for parseable float', function() { assert.equal(qs.parseStringVal('10.123'), 10.123); }); @@ -140,9 +148,33 @@ describe('parseStringVal()', function() { assert.equal(qs.parseStringVal('00010.123'), 10.123); }); + it('returns number for positive parseable float', function() { + assert.equal(qs.parseStringVal('+10.123'), 10.123); + }); + + it('returns number for negative parseable float', function() { + assert.equal(qs.parseStringVal('-10.123'), -10.123); + }); + it('returns string for empty string', function() { assert.equal(qs.parseStringVal(''), ''); }); + + it('returns string for space string', function() { + assert.equal(qs.parseStringVal(' '), ' '); + }); + + it('returns string for "number string number"', function() { + assert.equal(qs.parseStringVal('123abc123'), '123abc123'); + }); + + it('returns string for "string number"', function() { + assert.equal(qs.parseStringVal('abc123'), 'abc123'); + }); + + it('returns string for "number string"', function() { + assert.equal(qs.parseStringVal('123abc'), '123abc'); + }); }); describe('parseString()', function() {