Я хотел бы, чтобы самый простой отказоустойчивый тест проверял, что строка в JavaScript является положительным целым числом.
isNaN(str)
возвращает true для всех видов нецелых значений и parseInt(str)
возвращает целые числа для строк с плавающей запятой, например «2.5». И я не хочу использовать какой-либо плагин jQuery.
javascript
Мик Бирн
источник
источник
isNaN()
Функция ведет себя так , как это делает потому , что понятиеNot a Number
имеет очень специфическое значение в спецификации IEEE 794 с плавающей точкой. Он не намеревается дать ответ на простой разговорный вопрос: «Разве это значение не число?»٢٣٤
илиMCMXIX
оба являются допустимыми целочисленными представлениями, но я не думаю, что вы ищете код, который бы мог их проанализировать. Не могли бы вы указать, какие числовые форматы вы собираетесь поддерживать, поскольку люди, похоже, смущены этим.Ответы:
Два ответа для вас:
На основе разбора
Регулярное выражение
Обратите внимание, что в обоих случаях я интерпретировал «положительное целое число»
0
, хотя0
и не является положительным. Я включаю заметки, если вы хотите запретить0
.На основе разбора
Если вы хотите, чтобы это была нормализованная десятичная целочисленная строка в разумном диапазоне значений, вы можете сделать это:
или если вы хотите разрешить пробелы и начальные нули:
Тестовый стенд (без обработки начальных нулей или пробелов):
Показать фрагмент кода
Тестовый стенд ( с обработкой для ведущих нулей и пробелов):
Показать фрагмент кода
Если вы хотите запретить
0
, просто измените>= 0
на> 0
. (Или, в той версии , что позволяет ведущие нули, удалить|| "0"
наreplace
линии.)Как это работает:
В версии, допускающей пробелы и ведущие нули:
str = str.trim();
удаляет все начальные и конечные пробелы.if (!str)
ловит пустую строку и возвращает, нет смысла делать остальную часть работы.str = str.replace(/^0+/, "") || "0";
удаляет все начальные 0 из строки - но если это приводит к пустой строке, восстанавливает один 0.Number(str)
: Преобразоватьstr
в число; число может иметь дробную часть или может бытьNaN
.Math.floor
: Усечь число (отсекает любую дробную часть).String(...)
: Преобразует результат обратно в обычную десятичную строку. Для действительно больших чисел это пойдет в научную нотацию, которая может нарушить этот подход. (Я не совсем знаю, где находится разделение, детали в спецификации , но для целых чисел, я полагаю, это в тот момент, когда вы превысили 21 цифру [к этому времени число стало очень неточным, как IEEE-754 числа с двойной точностью имеют приблизительно 15 цифр ..)... === str
: Сравнивает это с исходной строкой.n >= 0
Проверьте, что это положительно.Обратите внимание, что это невозможно для ввода
"+1"
, любого ввода в научной нотации, который не превращается обратно в ту же научную нотацию наString(...)
стадии, и для любого значения, которое использует тип числа JavaScript (двоичная с плавающей точкой двойной точности IEEE-754) не может точно представить, какие разборы ближе к значению, отличному от заданного (которое включает в себя множество целых чисел свыше 9 007 199 254 740 992; например,1234567890123456789
потерпит неудачу). Первое легко исправить, последние два не так уж и много.Регулярное выражение
Другой подход заключается в проверке символов строки с помощью регулярного выражения, если ваша цель состоит в том, чтобы просто разрешить (скажем) необязательный параметр,
+
за которым следует либо0
строка, либо строка в обычном десятичном формате:Живой стенд:
Показать фрагмент кода
Как это работает:
^
: Сопоставить начало строки\+?
: Разрешить один, необязательно+
(удалите это, если вы не хотите)(?:...|...)
Разрешить один из этих двух вариантов (без создания группы захвата):(0|...)
: Разрешить0
самостоятельно ...(...|[1-9]\d*)
: ... или число, начинающееся с чего-то отличного от0
и сопровождаемое любым количеством десятичных цифр.$
: Сопоставить конец строки.Если вы хотите запретить
0
(потому что это не положительно), регулярное выражение становится просто/^\+?[1-9]\d*$/
(например, мы можем потерять чередование, которое нам нужно было разрешить0
).Если вы хотите разрешить начальные нули (0123, 00524), просто замените чередование
(?:0|[1-9]\d*)
на\d+
Если вы хотите разрешить пробелы, добавьте
\s*
сразу после^
и\s*
перед$
.Обратите внимание на то, когда вы преобразуете это в число: на современных движках, вероятно, было бы хорошо использовать
+str
илиNumber(str)
делать это, но более старые могут расширить их нестандартным (но ранее разрешенным) способом, который говорит, что ведущий ноль означает восьмеричное (основание 8), например, "010" => 8. После того, как вы проверили число, вы можете безопасно использовать его,parseInt(str, 10)
чтобы убедиться, что оно проанализировано как десятичное число (основание 10).parseInt
будет игнорировать мусор в конце строки, но мы убедились, что с регулярным выражением их нет.источник
Number(' ')
иNumber('')
return в0
то время как должны вернутьсяNaN
вместо.parseInt
возвращает2
./\D/.test('2a')
верно (потому что есть не цифра). Так что, возможноif (!/\D/.test(str) && !isNan((num = parseInt(str, 10))) { /* Valid number in num */}
... Прямо из моей головы ...Решение 1
Если мы считаем целочисленное значение JavaScript равным максимуму
4294967295
(то естьMath.pow(2,32)-1
), то следующее короткое решение будет отлично работать:ОПИСАНИЕ:
123.45 >>> 0 === 123
-1 >>> 0 === 4294967295
MAX_INT
1e10 >>> 0 === 1410065408
1e7 >>> 0 === 10000000
parseFloat
корректирует синтаксический анализ номеров строк (настройкаNaN
для нечисловых строк)ИСПЫТАНИЯ:
ДЕМО: http://jsfiddle.net/5UCy4/37/
Решение 2
Другой способ хорош для всех числовых значений, которые действительны до
Number.MAX_VALUE
, то есть до1.7976931348623157e+308
:ОПИСАНИЕ:
!isNaN(parseFloat(n))
используется для фильтрации чистых строковых значений, например""
," "
,"string"
;0 <= ~~n
Фильтры отрицательные и большие нецелые значения, например"-40.1"
,"129000098131766699"
;(!isNaN(parseFloat(n)) && 0 <= ~~n)
возвращает,true
если значение является как числовым, так и положительным ;0 === n % (...)
проверяет, является ли значение non-float - здесь(...)
(см. 3) оценивается как0
в случаеfalse
, так и1
в случаеtrue
.ИСПЫТАНИЯ:
ДЕМО: http://jsfiddle.net/5UCy4/14/
Предыдущая версия:
ДЕМО: http://jsfiddle.net/5UCy4/2/
источник
~~val
, что отрезать дробную часть. Это немного быстрее, так как выполняет одну побитовую операцию вместо двух.(!isNaN(parseFloat(n)) && n % 1 === 0 && 0 <= ~~n)
true, false, 0xFF
и другие значения делают этоisPositiveInteger
без обнаружения.Похоже, регулярное выражение это путь:
источник
0
там, где вы обычно не ожидаете, но в большинстве случаев это нормально.Современное решение, которое работает в узлах и в более чем 90% всех браузеров (кроме IE и Opera Mini), заключается в использовании Number.isInteger с последующей простой положительной проверкой.
Это было завершено в ECMAScript 2015 .
Полифил это:
Если вам нужно поддерживать ввод, который может быть в виде строки или числа, то вы можете использовать эту функцию, против которой я написал большой набор тестов после того, как все существующие ответы (1/2/2018) не сработали на какой-либо форме ввода.
источник
Это почти повторяющийся вопрос для этого:
Проверка десятичных чисел в JavaScript - IsNumeric ()
Это ответ:
Итак, положительное целое число будет:
источник
не будет работать, если вы дадите строку типа «0001», хотя
источник
Моя функция проверяет, является ли число + ve и может иметь десятичное значение.
источник
Просто, основываясь на ответе VisioN выше, если вы используете плагин проверки jQuery, вы можете использовать это:
Затем вы можете использовать в своем обычном наборе правил или динамически добавить его таким образом:
источник
просто
Вы также можете расширить Number и назначить ему функцию через прототип.
источник
Если вы используете формы HTML5, вы можете использовать атрибут
min="0"
для элемента формы<input type="number" />
. Это поддерживается всеми основными браузерами. Он не использует Javascript для таких простых задач, но интегрирован в новый стандарт HTML. Это задокументировано на https://www.w3schools.com/tags/att_input_min.aspисточник
(~~a == a)
гдеa
строкаисточник
~~"-1" == "-1"
вернетсяtrue
. И ОП попросил только натуральные числа.ES6:
источник