Skip to content
This repository was archived by the owner on May 1, 2025. It is now read-only.

Commit 75c7c5e

Browse files
committed
Merge pull request #24 from Turistforeningen/feat/strict-number-parsing
Stricter string to number parsing
2 parents 11025e1 + 91bc7e9 commit 75c7c5e

File tree

2 files changed

+125
-29
lines changed

2 files changed

+125
-29
lines changed

index.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,8 @@ module.exports.prototype.parseStringVal = function(string) {
189189
return true;
190190
} else if (this.string.toBoolean && string.toLowerCase() === 'false') {
191191
return false;
192-
} else if (this.string.toNumber && !isNaN(parseFloat(string, 10))) {
192+
} else if (this.string.toNumber && !isNaN(parseInt(string, 10)) &&
193+
(+string - +string + 1) >= 0) {
193194
return parseFloat(string, 10);
194195
} else {
195196
return string;

test.js

Lines changed: 123 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -101,47 +101,142 @@ describe('customAfter()', function() {
101101
});
102102

103103
describe('parseStringVal()', function() {
104-
it('returns boolean true for "true" string', function() {
105-
assert.equal(qs.parseStringVal('true'), true);
106-
});
104+
describe('true', function() {
105+
[
106+
'true',
107+
'TrUe',
108+
'TRUE'
109+
].forEach(function(val) {
110+
it('returns true for "'+ val + '" string', function() {
111+
assert.strictEqual(qs.parseStringVal(val), true);
112+
});
107113

108-
it('returns string "true" when boolean parsing is disabled', function() {
109-
qs.string.toBoolean = false;
110-
assert.equal(qs.parseStringVal('true'), 'true');
114+
it('returns "'+ val + '" for "'+ val + '" when !toBoolean', function() {
115+
qs.string.toBoolean = false;
116+
assert.strictEqual(qs.parseStringVal(val), val);
117+
});
118+
});
111119
});
112120

113-
it('returns boolean false for "flase" string', function() {
114-
assert.equal(qs.parseStringVal('false'), false);
115-
});
121+
describe('false', function() {
122+
[
123+
'false',
124+
'FaLsE',
125+
'FALSE'
126+
].forEach(function(val) {
127+
it('returns false for "'+ val + '" string', function() {
128+
assert.strictEqual(qs.parseStringVal(val), false);
129+
});
116130

117-
it('returns string "false" when boolean parsing is disabled', function() {
118-
qs.string.toBoolean = false;
119-
assert.equal(qs.parseStringVal('false'), 'false');
131+
it('returns "'+ val + '" for "'+ val + '" when !toBoolean', function() {
132+
qs.string.toBoolean = false;
133+
assert.strictEqual(qs.parseStringVal(val), val);
134+
});
135+
});
120136
});
121137

122-
it('returns number for parseable integer', function() {
123-
assert.equal(qs.parseStringVal('100'), 100);
124-
});
138+
describe('integers', function() {
139+
[
140+
'0',
141+
'1',
142+
'100',
143+
'000100',
125144

126-
it('returns string number when number parsing is disabled', function() {
127-
qs.string.toNumber = false;
128-
assert.equal(qs.parseStringVal('100'), '100');
129-
});
145+
'+0',
146+
'+1',
147+
'+100',
148+
'+000100',
130149

131-
it('returns number for zero padded parseable integer', function() {
132-
assert.equal(qs.parseStringVal('000100'), 100);
133-
});
150+
'-0',
151+
'-1',
152+
'-100',
153+
'-000100',
154+
155+
' 0 ',
156+
' 1 ',
157+
' 100 ',
158+
' 000100 ',
159+
].forEach(function(val) {
160+
var ret = parseInt(val, 10);
134161

135-
it('returns number for parseable float', function() {
136-
assert.equal(qs.parseStringVal('10.123'), 10.123);
162+
it('returns '+ ret +' for "'+ val + '"', function() {
163+
assert.strictEqual(qs.parseStringVal(val), ret);
164+
assert.notStrictEqual(qs.parseStringVal(val), NaN);
165+
});
166+
167+
it('returns "'+ val + '" for "'+ val + '" when !toNumber', function() {
168+
qs.string.toNumber = false;
169+
assert.strictEqual(qs.parseStringVal(val), val);
170+
});
171+
});
137172
});
138173

139-
it('returns number for zero padded parseable float', function() {
140-
assert.equal(qs.parseStringVal('00010.123'), 10.123);
174+
describe('floats', function() {
175+
[
176+
'0.0',
177+
'1.1',
178+
'100.99',
179+
'000100.0099',
180+
181+
'+0.0',
182+
'+1.1',
183+
'+100.99',
184+
'+000100.0099',
185+
186+
'-0.0',
187+
'-1.1',
188+
'-100.99',
189+
'-000100.0099',
190+
191+
' 0.0 ',
192+
' 1.1 ',
193+
' 100.99 ',
194+
' 000100.0099 ',
195+
].forEach(function(val) {
196+
var ret = parseFloat(val, 10);
197+
198+
it('returns '+ ret + ' for "'+ val + '"', function() {
199+
assert.strictEqual(qs.parseStringVal(val), parseFloat(val, 10));
200+
assert.notStrictEqual(qs.parseStringVal(val), NaN);
201+
});
202+
203+
it('returns "' + val + '" for "'+ val + '" when !toNumber', function() {
204+
qs.string.toNumber = false;
205+
assert.strictEqual(qs.parseStringVal(val), val);
206+
});
207+
});
141208
});
142209

143-
it('returns string for empty string', function() {
144-
assert.equal(qs.parseStringVal(''), '');
210+
describe('strings', function() {
211+
[
212+
'',
213+
214+
' ',
215+
' ',
216+
' ',
217+
218+
'+',
219+
'-',
220+
' + ',
221+
' - ',
222+
223+
'a',
224+
'ab',
225+
'abc',
226+
227+
' a ',
228+
' ab ',
229+
' abc ',
230+
231+
'abc123abc',
232+
'abc123',
233+
'123abc',
234+
'123abc123',
235+
].forEach(function(val) {
236+
it('returns "'+ val + '" for "'+ val + '"', function() {
237+
assert.strictEqual(qs.parseStringVal(val), val);
238+
});
239+
});
145240
});
146241
});
147242

0 commit comments

Comments
 (0)