Как проверить, является ли переменная целым числом в JavaScript, и выдать предупреждение, если это не так? Я попробовал это, но это не работает:
<html>
<head>
<script type="text/javascript">
var data = 22;
alert(NaN(data));
</script>
</head>
</html>
javascript
JBA
источник
источник
parseInt
.Number.isInteger
что является наименее хакерским способом.Ответы:
Используйте оператор === ( строгое равенство ), как показано ниже,
источник
2.0 === 2
как ненужный десятичный знак - это просто другое представление того же числа, чтоparseInt(2.0) === 2.0
эквивалентно тому,parseInt(2) === 2
что верноЭто зависит от того, хотите ли вы также привести строки в качестве потенциальных целых чисел?
Это будет делать:
С побитовыми операциями
Простой разбор и проверка
Короткое замыкание и сохранение операции разбора:
Или, возможно, оба в одном кадре:
тесты:
Вот скрипка: http://jsfiddle.net/opfyrqwp/28/
Представление
Тестирование показывает, что решение с коротким замыканием имеет лучшую производительность (ops / sec).
Вот эталонный тест: http://jsben.ch/#/htLVw
Если вам интересна более короткая, тупая форма короткого замыкания:
Конечно, я бы посоветовал министру позаботиться об этом.
источник
Предполагая, что вы ничего не знаете о рассматриваемой переменной, вы должны использовать этот подход:
Проще говоря:
источник
"1.0"
является строкой и поэтому не является числом. В противном случае1
будет значение переменной, если вы установите ее таким образомvar my_var=1.0;
, которая правильно определяется этой функцией как целое число.Number.isInteger()
будет работать ... до тех пор, это хороший способ сделать этоNumber.isInteger()
кажется, путь.MDN также предоставил следующий polyfill для браузеров, не поддерживающих
Number.isInteger()
, в основном, все версии IE.Ссылка на страницу MDN
источник
Вы можете проверить, есть ли у номера остаток:
Имейте в виду, если ваш ввод также может быть текстовым, и вы хотите сначала проверить, что это не так, то сначала вы можете проверить тип:
источник
0 % 1 === 0
в консоли. Он возвращаетсяtrue
как0 % 1
возвращается0
.0 % 1
возвращается0
в режим совместимости IE9, IE8 и IE7.Вы можете использовать простое регулярное выражение:
источник
Во-первых, NaN - это «число» (да, я знаю, что это странно, просто катитесь с ним), а не «функция».
Вам нужно проверить, является ли тип переменной числом, и проверить целое число, я бы использовал модуль.
источник
(0 == 0 || 0 % 1 == 0)
оценитtrue
.0 % 1 == 0
тоже оцениваетtrue
!%
это не разделение!Будьте осторожны при использовании
пустая строка ('') или логическое значение (истина или ложь) будут возвращаться как целое число. Вы можете не захотеть этого делать
Number.isInteger (данные)
встроенная функция в браузере. Dosnt поддерживает старые браузеры
Альтернативы:
Однако Math.round () также не будет работать для пустой строки и логического значения
источник
Чтобы проверить, хочет ли целое число, например, плакат:
уведомление + перед данными (преобразует строку в число) и === для точного.
Вот примеры:
источник
return (+data===parseInt(data))
?источник
Самое простое и чистое решение до ECMAScript-6 (которое также достаточно надежно, чтобы возвращать false, даже если в функцию передается не числовое значение, такое как строка или ноль):
Следующее решение также будет работать, хотя и не так элегантно, как приведенное выше:
Запись что Math.ceil () или Math.floor () могут использоваться одинаково хорошо (вместо Math.round ()) в приведенной выше реализации.
Или в качестве альтернативы:
Одно довольно распространенное неправильное решение заключается в следующем:
Хотя этот подход, основанный на parseInt, будет хорошо работать для многих значений x, как только x станет достаточно большим, он не сможет работать должным образом. Проблема в том, что parseInt () приводит свой первый параметр к строке перед анализом цифр. Следовательно, как только число станет достаточно большим, его строковое представление будет представлено в экспоненциальной форме (например, 1e + 21). Соответственно, parseInt () попытается проанализировать 1e + 21, но прекратит синтаксический анализ, когда достигнет символа e, и, следовательно, вернет значение 1. Обратите внимание:
источник
Почему никто не упомянул
Number.isInteger()
?https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger
У меня отлично работает и решает проблему с
NaN
начала числа.источник
Number.isInteger()
, 3,5 года до вас: stackoverflow.com/a/27424770/5208540В ES6 добавлено 2 новых метода для объекта Number.
В этом метод Number.isInteger () возвращает true, если аргумент является целым числом.
Пример использования:
источник
Стандарт ECMA-262 6.0 (ES6) включает функцию Number.isInteger .
Чтобы добавить поддержку старого браузера, я настоятельно рекомендую использовать сильное и поддерживаемое сообществом решение от:
https://github.com/paulmillr/es6-shim
которая является чистой библиотекой ES6 JS polyfills .
Обратите внимание, что эта библиотека требует es5-shim, просто следуйте README.md.
источник
Вы можете попробовать,
Number.isInteger(Number(value))
если этоvalue
может быть целое число в строковой форме, например,var value = "23"
и вы хотите, чтобы это оценивалосьtrue
. Старайтесь не пытаться,Number.isInteger(parseInt(value))
потому что это не всегда возвращает правильное значение. Например, еслиvar value = "23abc"
вы используетеparseInt
реализацию, она все равно вернет true.Но если вы хотите строго целочисленные значения, то, вероятно,
Number.isInteger(value)
следует сделать свое дело.источник
источник
Проверьте, равна ли переменная той же самой переменной, округленной до целого числа, например:
источник
true
кNaN
, просто изменяя!=
к!==
и переворачиваниюif
блоков. Это работает, потому чтоNaN
это единственное значение в JavaScript, которое не равно себе. Например, новый код должен бытьif (Math.round(x) === x) { /* x IS an integer! */ }
Кроме того,
Number.isInteger()
. Может быть ,Number.isSafeInteger()
это еще один вариант здесь , используя ES6 заданные.Чтобы заполнить
Number.isSafeInteger(..)
в браузерах до ES6:источник
Number.isInteger()
это лучший способ, если ваш браузер поддерживает его, если нет, я думаю, что есть много способов пойти:или:
или:
или:
Теперь мы можем проверить результаты:
Итак, все эти методы работают, но когда число очень велико, parseInt и оператор ^ не будут работать хорошо.
источник
Просто попробуйте это:
источник
Вы можете использовать эту функцию:
Он вернет true, даже если значение является строкой, содержащей целочисленное значение.
Итак, результаты будут:
источник
Мой подход:
a >= 1e+21
Тест может пройти только для значения, которое должно быть числом и очень большим. Это наверняка охватит все случаи, в отличие от других решений, которые были представлены в этом обсуждении.a === (a|0)
Если аргумент данной функции в точности (===) совпадает с побитно-преобразованным значением, это означает, что аргумент является целым числом.a|0
будет возвращаться0
для любого значенияa
, которое не является числом , и еслиa
это действительно число, оно будет отбрасывать что-либо после десятичной точки, поэтому1.0001
станет1
источник
Вы можете использовать регулярное выражение для этого:
источник
С http://www.toptal.com/javascript/interview-questions :
Нашел, что это лучший способ сделать это.
источник
Используйте
|
оператор:Итак, тестовая функция может выглядеть так:
источник
Это решит еще один сценарий ( 121. ), точка в конце
источник
Для положительных целочисленных значений без разделителей:
Тесты 1. если не пусто и 2. если значение равно результату замены нецифрового символа в его значении.
источник
Хорошо, получил минус, потому что не описал мой пример, так что больше примеров :):
Я использую регулярное выражение и метод тестирования:
источник
Вы также можете попробовать это так
или
источник
data=22.5;
. Также у обеих ветвей естьconsole.log("not an integer")
:: SЯ должен был проверить, является ли переменная (строка или число) целым числом, и я использовал это условие:
http://jsfiddle.net/e267369d/1/
Некоторые из других ответов имеют аналогичное решение (полагаться на в
parseFloat
сочетании сisNaN
), но мой должен быть более прямым и самоочевидным.Изменить: я обнаружил, что мой метод не работает для строк, содержащих запятую (например, «1,2»), и я также понял, что в моем конкретном случае я хочу, чтобы функция не работала, если строка не является допустимым целым числом (должен произойти сбой на любом плавающем даже 1.0). Итак, вот моя функция Mk II:
http://jsfiddle.net/e267369d/3/
Конечно, если вам действительно нужна функция для принятия целочисленных значений с плавающей запятой (1.0), вы всегда можете удалить условие точки
a.indexOf('.') == -1
.источник