Skip to content

Commit 9e4d54c

Browse files
authored
feat: stringify for integer numbers bigger than max safe integer (#1646)
1 parent d36e0e6 commit 9e4d54c

File tree

2 files changed

+40
-28
lines changed

2 files changed

+40
-28
lines changed

src/js/util.js

+4-1
Original file line numberDiff line numberDiff line change
@@ -1144,7 +1144,10 @@ export function parseString (str) {
11441144

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

test/util.test.js

+36-27
Original file line numberDiff line numberDiff line change
@@ -305,33 +305,42 @@ describe('util', () => {
305305
})
306306
})
307307

308-
it('should parse a string', () => {
309-
assert.strictEqual(parseString('foo'), 'foo')
310-
assert.strictEqual(parseString('234foo'), '234foo')
311-
assert.strictEqual(parseString(' 234'), 234)
312-
assert.strictEqual(parseString('234 '), 234)
313-
assert.strictEqual(parseString('2.3'), 2.3)
314-
assert.strictEqual(parseString('null'), null)
315-
assert.strictEqual(parseString('true'), true)
316-
assert.strictEqual(parseString('false'), false)
317-
assert.strictEqual(parseString('+1'), 1)
318-
assert.strictEqual(parseString('01'), '01')
319-
assert.strictEqual(parseString('001'), '001')
320-
assert.strictEqual(parseString('0.3'), 0.3)
321-
assert.strictEqual(parseString('0e3'), 0)
322-
assert.strictEqual(parseString(' '), ' ')
323-
assert.strictEqual(parseString(''), '')
324-
assert.strictEqual(parseString('"foo"'), '"foo"')
325-
assert.strictEqual(parseString('"2"'), '"2"')
326-
assert.strictEqual(parseString('\'foo\''), '\'foo\'')
327-
assert.strictEqual(parseString('0x1A'), '0x1A')
328-
assert.strictEqual(parseString('0x1F'), '0x1F')
329-
assert.strictEqual(parseString('0x1a'), '0x1a')
330-
assert.strictEqual(parseString('0b1101'), '0b1101')
331-
assert.strictEqual(parseString('0o3700'), '0o3700')
332-
assert.strictEqual(parseString('0X1a'), '0X1a')
333-
assert.strictEqual(parseString('0B1101'), '0B1101')
334-
assert.strictEqual(parseString('0O3700'), '0O3700')
308+
describe('parseString', () => {
309+
it('should parse a string', () => {
310+
assert.strictEqual(parseString('foo'), 'foo')
311+
assert.strictEqual(parseString('234foo'), '234foo')
312+
assert.strictEqual(parseString(' 234'), 234)
313+
assert.strictEqual(parseString('234 '), 234)
314+
assert.strictEqual(parseString('2.3'), 2.3)
315+
assert.strictEqual(parseString('null'), null)
316+
assert.strictEqual(parseString('true'), true)
317+
assert.strictEqual(parseString('false'), false)
318+
assert.strictEqual(parseString('+1'), 1)
319+
assert.strictEqual(parseString('01'), '01')
320+
assert.strictEqual(parseString('001'), '001')
321+
assert.strictEqual(parseString('0.3'), 0.3)
322+
assert.strictEqual(parseString('0e3'), 0)
323+
assert.strictEqual(parseString(' '), ' ')
324+
assert.strictEqual(parseString(''), '')
325+
assert.strictEqual(parseString('"foo"'), '"foo"')
326+
assert.strictEqual(parseString('"2"'), '"2"')
327+
assert.strictEqual(parseString('\'foo\''), '\'foo\'')
328+
assert.strictEqual(parseString('0x1A'), '0x1A')
329+
assert.strictEqual(parseString('0x1F'), '0x1F')
330+
assert.strictEqual(parseString('0x1a'), '0x1a')
331+
assert.strictEqual(parseString('0b1101'), '0b1101')
332+
assert.strictEqual(parseString('0o3700'), '0o3700')
333+
assert.strictEqual(parseString('0X1a'), '0X1a')
334+
assert.strictEqual(parseString('0B1101'), '0B1101')
335+
assert.strictEqual(parseString('0O3700'), '0O3700')
336+
assert.strictEqual(parseString('7405242042266046865'), '7405242042266046865')
337+
assert.strictEqual(parseString('9007199254740991'), 9007199254740991)
338+
assert.strictEqual(parseString('9007199254740991'), 9007199254740991)
339+
assert.strictEqual(parseString('-9007199254740991'), -9007199254740991)
340+
assert.strictEqual(parseString('1e25'), 1e25)
341+
assert.strictEqual(parseString('1e308'), 1e308)
342+
assert.strictEqual(parseString('1e309'), '1e309')
343+
})
335344
})
336345

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

0 commit comments

Comments
 (0)