Skip to content
Merged
5 changes: 4 additions & 1 deletion src/js/util.js
Original file line number Diff line number Diff line change
Expand Up @@ -1144,7 +1144,10 @@ export function parseString (str) {

const num = Number(str) // will nicely fail with '123ab'
const numFloat = parseFloat(str) // will nicely fail with ' '
if (!isNaN(num) && !isNaN(numFloat)) {
const isFiniteNumber = !isNaN(num) && !isNaN(numFloat) && isFinite(num)
const isInSafeRange = num <= Number.MAX_SAFE_INTEGER && num >= Number.MIN_SAFE_INTEGER
const isInteger = /^\d+$/.test(str)
if (isFiniteNumber && (isInSafeRange || !isInteger)) {
return num
}

Expand Down
63 changes: 36 additions & 27 deletions test/util.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -305,33 +305,42 @@ describe('util', () => {
})
})

it('should parse a string', () => {
assert.strictEqual(parseString('foo'), 'foo')
assert.strictEqual(parseString('234foo'), '234foo')
assert.strictEqual(parseString(' 234'), 234)
assert.strictEqual(parseString('234 '), 234)
assert.strictEqual(parseString('2.3'), 2.3)
assert.strictEqual(parseString('null'), null)
assert.strictEqual(parseString('true'), true)
assert.strictEqual(parseString('false'), false)
assert.strictEqual(parseString('+1'), 1)
assert.strictEqual(parseString('01'), '01')
assert.strictEqual(parseString('001'), '001')
assert.strictEqual(parseString('0.3'), 0.3)
assert.strictEqual(parseString('0e3'), 0)
assert.strictEqual(parseString(' '), ' ')
assert.strictEqual(parseString(''), '')
assert.strictEqual(parseString('"foo"'), '"foo"')
assert.strictEqual(parseString('"2"'), '"2"')
assert.strictEqual(parseString('\'foo\''), '\'foo\'')
assert.strictEqual(parseString('0x1A'), '0x1A')
assert.strictEqual(parseString('0x1F'), '0x1F')
assert.strictEqual(parseString('0x1a'), '0x1a')
assert.strictEqual(parseString('0b1101'), '0b1101')
assert.strictEqual(parseString('0o3700'), '0o3700')
assert.strictEqual(parseString('0X1a'), '0X1a')
assert.strictEqual(parseString('0B1101'), '0B1101')
assert.strictEqual(parseString('0O3700'), '0O3700')
describe('parseString', () => {
it('should parse a string', () => {
assert.strictEqual(parseString('foo'), 'foo')
assert.strictEqual(parseString('234foo'), '234foo')
assert.strictEqual(parseString(' 234'), 234)
assert.strictEqual(parseString('234 '), 234)
assert.strictEqual(parseString('2.3'), 2.3)
assert.strictEqual(parseString('null'), null)
assert.strictEqual(parseString('true'), true)
assert.strictEqual(parseString('false'), false)
assert.strictEqual(parseString('+1'), 1)
assert.strictEqual(parseString('01'), '01')
assert.strictEqual(parseString('001'), '001')
assert.strictEqual(parseString('0.3'), 0.3)
assert.strictEqual(parseString('0e3'), 0)
assert.strictEqual(parseString(' '), ' ')
assert.strictEqual(parseString(''), '')
assert.strictEqual(parseString('"foo"'), '"foo"')
assert.strictEqual(parseString('"2"'), '"2"')
assert.strictEqual(parseString('\'foo\''), '\'foo\'')
assert.strictEqual(parseString('0x1A'), '0x1A')
assert.strictEqual(parseString('0x1F'), '0x1F')
assert.strictEqual(parseString('0x1a'), '0x1a')
assert.strictEqual(parseString('0b1101'), '0b1101')
assert.strictEqual(parseString('0o3700'), '0o3700')
assert.strictEqual(parseString('0X1a'), '0X1a')
assert.strictEqual(parseString('0B1101'), '0B1101')
assert.strictEqual(parseString('0O3700'), '0O3700')
assert.strictEqual(parseString('7405242042266046865'), '7405242042266046865')
assert.strictEqual(parseString('9007199254740991'), 9007199254740991)
assert.strictEqual(parseString('9007199254740991'), 9007199254740991)
assert.strictEqual(parseString('-9007199254740991'), -9007199254740991)
assert.strictEqual(parseString('1e25'), 1e25)
assert.strictEqual(parseString('1e308'), 1e308)
assert.strictEqual(parseString('1e309'), '1e309')
})
})

it('should find a unique name', () => {
Expand Down