Я надеюсь, что есть что-то в том же концептуальном пространстве, что и старая IsNumeric()
функция VB6 ?
javascript
validation
numeric
Electrons_Ahoy
источник
источник
isNaN("")
,isNaN(" ")
,isNaN(false)
и т.д. Он возвращаетсяfalse
для них, это означает , что они являются числами.Ответы:
Чтобы проверить, является ли переменная (включая строку) числом, проверьте, не является ли она числом:
Это работает независимо от того, является ли содержимое переменной строкой или числом.
Примеры
Конечно, вы можете отрицать это, если вам нужно. Например, чтобы реализовать
IsNumeric
пример, который вы дали:Чтобы преобразовать строку, содержащую число, в число:
Работает только в том случае, если строка содержит только числовые символы, иначе она возвращает
NaN
.Примеры
Чтобы преобразовать строку свободно в число
Полезно для преобразования 12px в 12, например:
Примеры
Поплавки
Имейте в виду , что, в отличие от
+num
,parseInt
(как следует из названия) преобразует поплавок в целое число, отрубая все после десятичной точки (если вы хотите использоватьparseInt()
из - за этого поведения, вы , вероятно , лучше использовать другой метод вместо ) :Пустые строки
Пустые строки могут быть немного нелогичными.
+num
преобразует пустые строки или строки с пробелами в ноль иisNaN()
предполагает то же самое:Но
parseInt()
не согласенисточник
isNaN
«Чтобы проверить, не является ли переменная числом». «не число» - это не то же самое, что «IEEE-794 NaN», для чего и проводитсяisNaN
проверка. В частности, это использование не выполняется, по крайней мере, при тестировании логических значений и пустых строк. См. Developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… .var n = 'a'; if (+n === +n) { // is number }
она на ~ 3994% быстрее, чем isNaN в последней версии Chrome. Смотрите тест производительности здесь: jsperf.com/isnan-vs-typeof/5isNaN(1 + false + parseInt("1.do you trust your users?"))
И вы могли бы пойти RegExp-путь:
источник
Если вы просто пытаетесь проверить, является ли строка целым числом (без десятичных разрядов), регулярное выражение является хорошим способом. Другие методы, такие как
isNaN
слишком сложные для чего-то такого простого.Чтобы разрешить только положительные целые числа, используйте это:
источник
/^-?\d+$/
правильно?Если вы действительно хотите , чтобы убедиться сделать , что строка содержит только число, любое число (целое или с плавающей точкой), а именно номер, вы не можете использовать
parseInt()
/parseFloat()
,Number()
или!isNaN()
сами по себе. Обратите внимание, что!isNaN()
на самом деле возвращается,true
когдаNumber()
вернется число, иfalse
когда оно вернетсяNaN
, поэтому я исключу его из остальной части обсуждения.Проблема в
parseFloat()
том, что он вернет число, если строка содержит любое число, даже если строка не содержит только и точно число:Проблема в
Number()
том, что он будет возвращать число в случаях, когда переданное значение не является числом вообще!Проблема с прокруткой вашего собственного регулярного выражения состоит в том, что если вы не создадите точное регулярное выражение для сопоставления числа с плавающей запятой, как Javascript распознает его, вы пропустите дела или узнаете случаи, в которых вы не должны. И даже если вы можете бросить свое собственное регулярное выражение, почему? Есть более простые встроенные способы сделать это.
Тем не менее, оказывается, что
Number()
(иisNaN()
) делает правильные вещи для каждого случая, когдаparseFloat()
возвращает число, когда это не должно, и наоборот. Поэтому, чтобы узнать, является ли строка действительно точной и только числом, вызовите обе функции и посмотрите, возвращают ли они обе true:источник
' 1'
,'2 '
И' 3 '
все возвращает истину.isNumber
функция, не имеют дело с пользовательскими интерфейсами. Кроме того, хороший ввод числа не позволяет пробелы начинаться с.Принятый ответ на этот вопрос имеет довольно много недостатков (как было подчеркнуто несколькими другими пользователями). Это один из самых простых и проверенных способов подойти к нему в javascript:
Ниже приведены несколько хороших тестовых случаев:
источник
Попробуйте функцию isNan :
источник
isNaN()
возвращаетfalse
для ЛЮБОЙ строки, содержащей только пробельные символы, включая такие вещи, как '\ u00A0'.Старый вопрос, но в данных ответах не хватает нескольких пунктов.
Научная нотация.
!isNaN('1e+30')
этоtrue
, однако , в большинстве случаев , когда люди просят числа, они не хотят , чтобы соответствовать вещам , как1e+30
.Большие плавающие числа могут вести себя странно
Обратите внимание (используя Node.js):
С другой стороны:
Итак, если вы ожидаете
String(Number(s)) === s
, то лучше ограничить ваши строки максимум 15 цифрами (после пропуска ведущих нулей).бесконечность
Учитывая все это, проверяем, что данная строка является числом, удовлетворяющим всем следующим условиям:
Number
и обратно вString
это не такая простая задача. Вот простая версия:
Однако даже этот далеко не полный. Ведущие нули здесь не обрабатываются, но они проверяют длину теста.
источник
Я проверил, и решение Майкла лучшее. Проголосуйте за его ответ выше (найдите на этой странице «Если вы действительно хотите убедиться, что строка», чтобы найти его). По сути, его ответ таков:
Это работает для каждого теста, который я задокументировал здесь: https://jsfiddle.net/wggehvp9/5/
Многие из других решений терпят неудачу для этих крайних случаев: '', null, "", true и []. Теоретически, вы можете использовать их с правильной обработкой ошибок, например:
или
со специальной обработкой для / \ s /, null, "", true, false, [] (и других?)
источник
Вы можете использовать результат Number при передаче аргумента его конструктору.
Если аргумент (строка) не может быть преобразован в число, он возвращает NaN, поэтому вы можете определить, является ли указанная строка действительным числом или нет.
Примечания: Обратите внимание, при пропуске пустой строки или,
'\t\t'
а'\n\t'
как число вернет 0; Передача true вернет 1, а false вернет 0.источник
Number
Конструктор точно так же , как и+x
.Number()
обрабатывает числа с плавающей точкой, какNumber.parseFloat()
нетNumber.parseInt()
Может быть, есть один или два человека, которые сталкиваются с этим вопросом, которые нуждаются в гораздо более строгой проверке, чем обычно (как я сделал). В этом случае это может быть полезно:
Осторожно! Это будет отвергать строки , как
.1
,40.000
,080
,00.1
. Это очень придирчиво - строка должна соответствовать " самой минимальной совершенной форме " числа, чтобы этот тест прошел.Он использует конструктор
String
andNumber
для приведения строки к числу и обратно и, таким образом, проверяет, соответствует ли «идеальная минимальная форма» движка JavaScript (та, в которую он преобразован с помощью начальногоNumber
конструктора) исходной строке.источник
(str === String(Math.round(Number(str))))
."Infinity"
,"-Infinity"
и"NaN"
пройти этот тест. Однако это можно исправить с помощью дополнительногоNumber.isFinite
теста.str === ("" + +str)
. Он в основном проверяет, является ли строка результатом строкового числа JS. Зная это, мы также можем увидеть проблему: тест проходит,0.000001
но не проходит0.0000001
, то есть когда1e-7
проходит вместо. То же самое для очень больших чисел.parseInt (), но имейте в виду, что эта функция немного отличается в том смысле, что она, например, возвращает 100 для parseInt ("100px").
источник
parseInt(09)
.paraseInt(09, 10)
, 10
аргумент.parseInt('09')
теперь равно 9.Quote:
не совсем верно, если вам нужно проверить начальные / конечные пробелы - например, когда требуется определенное количество цифр, и вам нужно получить, скажем, «1111», а не «111» или «111» для, возможно, PIN-кода вход.
Лучше использовать:
источник
'-1'
,'0.1'
и'1e10'
все возвращается ложь. Кроме того, значения больше положительной бесконечности или меньше отрицательной бесконечности возвращают true, в то время как они, вероятно, должны возвращать false.Почему реализация jQuery недостаточно хороша?
Майкл предложил что-то вроде этого (хотя я украл измененную версию "user1691651 - John" здесь):
Ниже приведено решение, которое, скорее всего, имеет плохую производительность, но хорошие результаты. Это придумка, сделанная из реализации jQuery 1.12.4 и ответа Майкла, с дополнительной проверкой для пробелов в начале / конце (потому что версия Майкла возвращает true для чисел с пробелами в начале / конце):
Последняя версия имеет две новые переменные. Один из них можно обойти, выполнив:
Я не очень-то тестировал эти средства, кроме как вручную протестировать те несколько сценариев использования, которые мне удастся использовать в моем нынешнем затруднительном положении, и все это очень стандартные вещи. Это ситуация «стоять на плечах гигантов».
источник
Это недопустимо для TypeScript как:
declare function isNaN(number: number): boolean;
Для TypeScript вы можете использовать:
/^\d+$/.test(key)
источник
Ну, я использую тот, который я сделал ...
Это работает до сих пор:
Если вы обнаружите какие-либо проблемы с этим, скажите мне, пожалуйста.
источник
return !isNaN(parseInt(value, 10));
Если кто-нибудь когда-нибудь зайдет так далеко, я потратил некоторое время на то, чтобы попытаться исправить patch.js ( https://github.com/moment/moment ). Вот что я у него забрал:
Обрабатывает следующие случаи:
Правда! :
Ложь! :
По иронии судьбы, тот, с которым я борюсь больше всего:
Любые предложения приветствуются. :]
источник
isNumeric(' ')
иisNumeric('')
?&& (val.replace(/\s/g,'') !== '') //Empty && (val.slice(-1) !== '.') //Decimal without Number
, чтобы адресовать вышеупомянутую проблему и один, который у меня был сам.Используя простой JavaScript:
Используя Lodash:
источник
источник
2019: включая примеры ES3, ES6 и TypeScript
Возможно, это повторялось слишком много раз, однако сегодня я тоже боролся с этим и хотел опубликовать свой ответ, так как я не видел никакого другого ответа, который делает это так просто или тщательно:
ES3
ES6
Машинопись
Это кажется довольно простым и охватывает все основы, которые я видел на многих других постах и придумал сам:
Вы также можете попробовать свою собственную
isNumeric
функцию и просто пройти мимо этих вариантов использования и отсканировать «true» для всех из них.Или, чтобы увидеть значения, которые каждый возвращает:
источник
2019: практическая и строгая проверка числовой достоверности
Часто «действительное число» означает число Javascript, исключая NaN и Infinity, то есть «конечное число».
Чтобы проверить числовую достоверность значения (например, из внешнего источника), вы можете определить в стиле ESlint Airbnb:
и используйте это так:
источник
ПФБ рабочий раствор:
источник
Избавьте себя от головной боли, пытаясь найти «встроенное» решение.
Там нет хорошего ответа, и крайне недооцененный ответ в этой теме является неправильным.
npm install is-number
источник
Недавно я написал статью о том, как убедиться, что переменная является действительным числом: https://github.com/jehugaleahsa/artifacts/blob/master/2018/typescript_num_hack.md В статье объясняется, как обеспечить с плавающей запятой или целое число, если это важно (
+x
против~~x
).В статье предполагается, что переменная a
string
или anumber
для начала иtrim
доступна / заполнена. Нетрудно расширить его и на другие типы. Вот мясо этого:источник
Моя попытка немного сбить с толку, Pherhaps не лучшее решение
источник
042
) и hexadecimal (0x45f
)В моем приложении мы допускаем только символы AZ и 0-9. Я нашел ответ выше с использованием « string % 1 === 0», если строка не начиналась с 0xnn (например, 0x10), а затем возвращала ее как числовую, когда мы этого не хотели. Следующая простая ловушка в моей числовой проверке, кажется, помогает в наших конкретных случаях.
Предупреждение : это может быть использование давней ошибки в Javascript и Actionscript [Number ("1" + the_string)% 1 === 0)], я не могу за это говорить, но это именно то, что нам нужно.
источник
% 1
операцию), и это будет интерпретировать строку как шестнадцатеричный или плавающий литерал.Мое решение:
Вы можете добавить дополнительные условия внутри цикла, чтобы соответствовать вашим конкретным потребностям.
источник
Вы можете использовать типы, как в потоке librar y, для статической проверки времени компиляции. Конечно, не очень полезно для пользовательского ввода.
источник
Вот одна строка, чтобы проверить,
sNum
является ли допустимое числовое значение; он был протестирован для широкого спектра материалов:источник
Просто используйте
isNaN()
, это преобразует строку в число, и если получит правильное число , вернетfalse
...источник
Я использую следующее:
источник
1..1
,1,1
,-32.1.12
и , что более важно не удаетсяundefined
иNaN
. Если вы передадитеundefined
или a,NaN
то это вернет вам ложное срабатывание, говорящее, что это число