JS Regex говорит, что Number содержит «.» но нет ни одного - PullRequest
2 голосов
/ 24 января 2020

На этой странице, https://emperorbob7.github.io/JSheets/, у меня есть функция с именем TYPE, синтаксис для которой связан на странице, RegEx, используемый для функции обнаружения десятичного числа, находится в кодовом блоке ниже *

Как только я ввожу слишком много чисел, ТИП говорит, что ячейка содержит десятичную дробь, несмотря на то, что ее там нет. Это автоматическая c функция, которая добавляет. всякий раз, когда число превышает определенный предел?

Пример: 3123123123123123123122312312312 Выход: десятичное значение Редактировать:

function TYPE() {
	const regex = /\.[0-9]/;
	if(arguments[0] == "true" || arguments[0] == "false")
		return "Boolean";
	if(isNaN(arguments[0]))
		return "String";
	else if(regex.test(arguments[0]))
		return "Decimal";
	else
		return "Integer";
}

Код ^ Извините, что не опубликовал его раньше, буду помнить об этом на будущее.

Извините за плохо сформулированный вопрос, заранее спасибо

Ответы [ 2 ]

3 голосов
/ 24 января 2020

У вас есть целое число, которое больше, чем может обработать объект Number (см .: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER), поэтому при преобразовании в строку для регулярного выражения оно становится экспоненциальным значением.

Попробуйте console.log(3123123123123123123122312312312);, и вы получите 3.123123123123123e+30

Или

let val = 3123123123123123123122312312312;
val.toString();

"3.123123123123123e+30"

Вы также можете проверить свое значение с помощью Number.isSafeInteger(3123123123123123123122312312312);, который возвращает false.

Решение состоит в том, чтобы использовать Number.isInteger(); в качестве теста вместо регулярного выражения. Правильно возвращается true для вашего большого числа.

См .: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger

0 голосов
/ 24 января 2020

Javascript может безопасно хранить только целые числа до 9007199254740991 . Кроме того, javascript может преобразовать число в обозначение мощности (т. Е. 5000000000000000000000 становится 5e+21) или начать преобразование цифр в нули для хранения.

var n = 3123123123123123123122312312312;
console.log(n);
/* Output: 3.123123123123123e+30 */

Вы можете использовать Number.isSafeInteger() для проверки находится ли номер в безопасном диапазоне, а затем примените к нему свой оригинальный код. Если нет, вы можете выполнить другой тест (например, тест против /\d\.\d+e\+\d+), чтобы увидеть, связано ли десятичное число с записью экспоненты.

Также следует помнить, что число в записи экспоненты будет проверять true используя Number.isInteger(), даже если это была плавающая точка для начала, так как эта информация будет потеряна.

var x_int = 3123123123123123123122312312312;
var x_flt = 3123123123123123123122312312312.333333333;
console.log( x_int === x_flt);
/* Output: true */

console.log(Number.isInteger(x_flt));
/* Output: true */
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...