diff --git a/src/utils/number.js b/src/utils/number.js index 5095b71628..9962b681f9 100644 --- a/src/utils/number.js +++ b/src/utils/number.js @@ -20,12 +20,11 @@ export function isInteger (value) { } /** - * Check if a string contains an integer + * Check if a string contains an integer number like "123" and "-123" * @param {string} str * @return {boolean} isInteger */ export function isIntegerStr (str) { - // regex matching strings like "123" and "-123" return /^-?\d+$/.test(str) } @@ -48,8 +47,12 @@ export function isIntegerStr (str) { * @returns {'number' | 'BigNumber' | 'bigint' | 'Fraction'} */ export function safeNumberType (numberStr, config) { - if (config.number === 'bigint' && !isIntegerStr(numberStr)) { - return config.numberFallback + if (config.number === 'bigint') { + try { + BigInt(numberStr) + } catch { + return config.numberFallback + } } return config.number diff --git a/test/unit-tests/expression/parse.test.js b/test/unit-tests/expression/parse.test.js index 92a1871b5f..51651a5adc 100644 --- a/test/unit-tests/expression/parse.test.js +++ b/test/unit-tests/expression/parse.test.js @@ -2248,6 +2248,12 @@ describe('parse', function () { assert.strictEqual(bigmath.evaluate('-2.3'), -2.3) }) + it('should parse hex, bin, oct numbers as bigint', function () { + assert.strictEqual(bigmath.evaluate('0xA2'), 162n) + assert.strictEqual(bigmath.evaluate('0b1011'), 11n) + assert.strictEqual(bigmath.evaluate('0o70'), 56n) + }) + it('should fallback on the configured numberFallback when parsing as bigint', function () { const bigmathFallback = math.create({ number: 'bigint',