(Встроенный) способ в JavaScript, чтобы проверить, является ли строка допустимым числом

Я надеюсь, что есть что-то в том же концептуальном пространстве, что и старая функция VB6 IsNumeric()?

См. этот связанный вопрос, о котором я спросил некоторое время назад.

Michael Haren 06.10.2008 23:17

Если вы перейдете к этому вопросу, попробуйте пропустить все ответы RegEx. Это просто НЕ способ сделать это.

Joel Coehoorn 06.10.2008 23:20

Если только кто-то не хочет делать именно это: проверить, имеет ли данная строка формат допустимого потока цифр. Почему тогда это должно быть неправильно?

SasQ 19.05.2014 03:53
Выбран неверный ответ !!! See its comments, but basically it fails with e.g. isNaN(""), isNaN(" "), isNaN(false), etc. It returns false for these, implying that they are numbers.
Andrew 05.10.2017 23:42

поэтому выбранный ответ неверен, регулярное выражение тоже не подходит. Какой тогда правильный?

vir us 09.05.2020 11:10

какой из них правильный?

manymanymore 01.06.2020 23:48

Не встроен, но ... JQuery имеет хорошо протестированный api.jquery.com/jquery.isnumeric

rothschild86 26.06.2020 13:40
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1 389
7
901 669
37
Перейти к ответу Данный вопрос помечен как решенный

Ответы 37

Попробуйте isNan функция:

The isNaN() function determines whether a value is an illegal number (Not-a-Number).

This function returns true if the value equates to NaN. Otherwise it returns false.

This function is different from the Number specific Number.isNaN() method.

  The global isNaN() function, converts the tested value to a Number, then tests it.

Number.isNan() does not convert the values to a Number, and will not return true for any value that is not of the type Number...

Убедитесь, что вы добавили проверку на пустую строку. isNaN ('') возвращает false, но в этом случае вы, вероятно, захотите вернуть true.

Michael Haren 06.10.2008 23:44

isFinite - лучшая проверка - она ​​имеет дело со странным угловым случаем Infinity.

JonnyRaa 20.01.2015 15:02

@MichaelHaren Недостаточно хорош! isNaN() возвращает false для строки ЛЮБЫЕ, содержащей только символы пробела, включая такие вещи, как '\ u00A0'.

Michael 03.03.2016 01:13

ВНИМАНИЕ: не работает для значений: null, "" (пустая строка) и false.

Krisztián Balla 27.07.2017 11:02

Я понимаю, что этот ответ был дан 11 лет назад и на несколько минут раньше принятого, но, нравится вам это или нет, принятый ответ имеет НАМНОГО больше разговоров вокруг него, поэтому этот ответ на самом деле ничего не добавляет к ответу на вопрос. Я предлагаю удалить его, чтобы не отвлекать новых читателей. Я также думаю, что вы получите значок дисциплины, если сделаете это.

Dan Dascalescu 06.10.2019 09:15

parseInt (), но имейте в виду, что эта функция немного отличается в том смысле, что она, например, возвращает 100 для parseInt ("100px").

И 11 для parseInt(09).

djechlin 26.06.2013 02:43

потому что вам нужно использовать paraseInt(09, 10)

Gavin 27.06.2014 21:21
Начиная с ECMAScript 5, which has широкая поддержка браузера (IE≥9), you don't need the , 10 argument any more. parseInt('09') now equals 9.
Rory O'Kane 02.10.2017 22:48

И вы можете пойти по пути RegExp:

var num = "987238";

if (num.match(/^-?\d+$/)){
  //valid integer (positive or negative)
}else if (num.match(/^\d+\.\d+$/)){
  //valid float
}else{
  //not valid number
}

В этом случае RegExp == bad

Joel Coehoorn 06.10.2008 23:27

Это не работает с шестнадцатеричными числами (например, 0x12), числами с плавающей запятой без начального нуля (например, .42) и отрицательными числами.

Ori 18.04.2012 05:25

@JoelCoehoorn Уточните, почему здесь RegExp == плохо? Мне кажется, это допустимый вариант использования.

computrius 30.12.2014 19:02

Есть больше способов, чем кажется, построить число (шестнадцатеричные числа в другом комментарии - это лишь один пример), и есть много чисел, которые нельзя считать действительными (переполнение типа, слишком точное и т. д.). Кроме того, регулярное выражение и медленнее, и сложнее, чем просто использование встроенных механизмов.

Joel Coehoorn 30.12.2014 21:18

Предложите /^-?\d+$/ и /^-?\d*\.\d+$/, например «-42» и «-.42»

Bob Stein 19.11.2016 21:43

Как насчет этого ? ^ (-?) \ d * (\.? \ d + | \ d *) $

Nicu 26.01.2017 21:53

Обратите внимание, что выполнение myRegExp.test (num) немного более эффективно, чем подход сопоставления. См. jsperf.com/regexp-test-search-vs-indexof/12

danba 23.05.2017 10:51

также должны соответствовать научным обозначениям ... 1e10 и т. д.

Joseph Merdrignac 31.10.2017 00:45

Голосование против: вместо использования Regex рассмотрите возможность использования JQuery $.isNumeric. Существует так много возможностей представления чисел, что вы, скорее всего, не сможете рассмотреть их все с помощью регулярного выражения.

markus s 18.05.2018 08:26
Ответ принят как подходящий

2 октября 2020 г .: обратите внимание, что многие простые подходы чреваты тонкими ошибками (например, пробелы, неявный частичный синтаксический анализ, основание, приведение массивов и т. д.), Которые многие из ответов здесь не принимают во внимание. Следующая реализация может сработать для вас, но обратите внимание, что она не обслуживает разделители чисел, кроме десятичной точки «.»:

function isNumeric(str) {
  if (typeof str != "string") return false // we only process strings!  
  return !isNaN(str) && // use type coercion to parse the _entirety_ of the string (`parseFloat` alone does not do this)...
         !isNaN(parseFloat(str)) // ...and ensure strings of whitespace fail
}

Чтобы проверить, является ли переменная (включая строку) числом, проверьте, не является ли это числом:

Это работает независимо от того, является ли содержимое переменной строкой или числом.

isNaN(num)         // returns true if the variable does NOT contain a valid number

Примеры

isNaN(123)         // false
isNaN('123')       // false
isNaN('1e10000')   // false (This translates to Infinity, which is a number)
isNaN('foo')       // true
isNaN('10px')      // true

Конечно, при необходимости это можно отрицать. Например, чтобы реализовать приведенный вами пример IsNumeric:

function isNumeric(num){
  return !isNaN(num)
}

Чтобы преобразовать строку, содержащую число, в число:

Работает, только если строка Только содержит числовые символы, иначе возвращает NaN.

+num               // returns the numeric value of the string, or NaN 
                   // if the string isn't purely numeric characters

Примеры

+'12'              // 12
+'12.'             // 12
+'12..'            // NaN
+'.12'             // 0.12
+'..12'            // NaN
+'foo'             // NaN
+'12px'            // NaN

Для простого преобразования строки в число

Полезно для преобразования 12 пикселей в 12, например:

parseInt(num)      // extracts a numeric value from the 
                   // start of the string, or NaN.

Примеры

parseInt('12')     // 12
parseInt('aaa')    // NaN
parseInt('12px')   // 12
parseInt('foo2')   // NaN      These last two may be different
parseInt('12a5')   // 12       from what you expected to see. 

Поплавки

Имейте в виду, что, в отличие от +num, parseInt (как следует из названия) преобразует число с плавающей запятой в целое, отбрасывая все, что находится после десятичной точки (если вы хотите использовать parseInt()из-за, это поведение, вам, вероятно, лучше вместо этого использовать другой метод):

+'12.345'          // 12.345
parseInt(12.345)   // 12
parseInt('12.345') // 12

Пустые строки

Пустые строки могут показаться немного нелогичными. +num преобразует пустые строки или строки с пробелами в ноль, а isNaN() предполагает то же самое:

+''                // 0
+'   '             // 0
isNaN('')          // false
isNaN('   ')       // false

Но parseInt() не согласен:

parseInt('')       // NaN
parseInt('   ')    // NaN

Очень важное замечание о parseInt заключается в том, что он позволяет вам указать систему счисления для преобразования строки в int. Это большая ошибка, поскольку он пытается угадать систему счисления, если вы ее не укажете. Так, например: parseInt ("17") дает 17 (десятичное, 10), но parseInt ("08") дает 0 (восьмеричное, 8). Итак, если вы не хотите иного, безопаснее всего использовать parseInt (number, 10), явно указав 10 в качестве системы счисления.

Adam Raney 29.04.2009 02:48

Обратите внимание, что! IsNaN (undefined) возвращает false.

David Hellsing 06.11.2010 08:34

Голосование вниз, потому что isNaN также возвращает false с кодировкой 9, что может случиться с другими «странными» кодами.

Jorge Fuentes González 28.12.2013 03:02

Это просто неправильно - как он получил столько голосов? Вы не можете использовать isNaN «Чтобы проверить, не является ли переменная числом». «не число» - это не то же самое, что «IEEE-794 NaN», что и проверяет isNaN. В частности, такое использование не работает, по крайней мере, при тестировании логических значений и пустых строк. См. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/….

EML 30.12.2013 04:33

Обратите внимание, что isNaN (true) и isNaN (false) всегда будут возвращать false! Таким образом, логические значения также являются числами для этой функции)

Олег Всильдеревьев 18.01.2014 14:33

Самый быстрый способ проверить, является ли что-то числом, - это проверка «равно самому себе»: var n = 'a'; if (+n === +n) { // is number } Это ~ 3994% быстрее, чем isNaN в последней версии Chrome. Смотрите тест производительности здесь: jsperf.com/isnan-vs-typeof/5

Kevin Jurkowski 22.01.2014 04:59

+ "строка" не возвращает надежно NaN, если в качестве основания полагается нечисловые символы. попробуйте + "0x30"

hacklikecrack 12.02.2014 16:03

Собственно при проверке: parseInt('') === NaN - выходит из строя. Хотя, выводя его в окно консоли: parseInt(''); // prints NaN. Странный

Arman Bimatov 09.03.2014 21:59

@ Арман-Биматов, потому что NaN! == NaN. Чтобы проверить, не является ли результат parseInt (x) числом, вы должны проверить isNaN (parseInt (x))

corvec 28.03.2014 21:36

!isNaN(false) = true так ложно это число?

dcsan 12.03.2015 04:47

@dcsan false и true можно интерпретировать как 0 и 1. false + true + true + false + true; равно 3 (например, 0 + 1 + 1 + 0 + 1). Так да. См. Комментарий @corvec, вместо этого вы должны использовать !isNaN(parseInt(false)), он вернет false

dominicbri7 07.01.2016 22:56

isNaN(' ') == false, значит, пустое место - действительное число ?!

Michael 03.03.2016 01:12

@Dan Возможно, к этому ответу следует добавить функцию isFinite. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

erikvimz 25.05.2016 13:58

"Только содержит числовые символы" немного преувеличивает. Предлагаем вам добавить список исключений: +'0xdeadbeef' === 3735928559 и +'6e4' == 60000

Bob Stein 19.11.2016 21:40

** Предупреждение ** Это неверный ответ. Используйте на свой риск. Пример: isNaN(1 + false + parseInt("1.do you trust your users?"))

keithpjolley 31.05.2017 17:50

Если вы используете isNaN - имейте в виду следующие опасные аргументы, для которых isNaN вернет false: isNaN([]), isNaN([234]), isNaN(null), isNaN(true), isNaN(false), isNaN(''), isNaN(' '). Последний - это строка из одного или нескольких пробелов.

Alexander 24.09.2017 13:19

Также имейте в виду, что есть случай, когда isNaN может закончиться исключением. Это происходит, если вы пытаетесь применить его к символу: var mySymbol = Symbol('Hey'), а затем isNaN(mySymbol) выбрасывает Cannot convert a Symbol value to a number вместо возврата true.

Alexander 24.09.2017 13:27

@Dan, можете ли вы обновить свой ответ, чтобы устранить риски использования проверок isNaN с пустыми пробелами, ложными значениями и т. д.? Очевидно, этот пост вызывает много ошибок.

y3sh 27.10.2017 22:02

Это не правильно. !isNaN(parseInt('5aaaa')) возвращает истину, но "5aaaa" явно не число.

zfj3ub94rf576hc4eegm 08.06.2018 20:59

также проблема с нулевым значением:! isNaN (12) -> true,! isNaN (null) -> true

Jan Pi 11.01.2019 21:40

Примечание: isNaN (new Date ()) возвращает false!

xuxu 09.05.2019 10:40

! isNaN (ноль) => истина

TSR 29.07.2019 15:33

Проверьте этот ответ. Это сработало лучше, чем принятое решение.

Victor M Herasme Perez 05.08.2019 15:25

Это не правильно. Модераторы, пожалуйста, подумайте о том, чтобы пометить этот ответ как возможно содержащий некачественную информацию. Во-первых, IsNaN ("") возвращает false, что явно неверно. Это все равно, что сказать isSandwich о пустой тарелке.

Newclique 01.09.2019 00:29

@Wade Вы действительно пробовали оценить isNan ("")? он определенно возвращает false, по крайней мере, в Chrome. Я знаю, что это бессмысленно - но такое поведение!

Dan 02.09.2019 12:30

Конечно. Признаком того, что в isNaN что-то не так, является то, что никакой типизированный язык не позволит вам присвоить "" переменной, набранной как число (например, Double, Int, Float и т. д.). Тем не менее, согласно IsNaN, "" эквивалентно чему-то числовому.

Newclique 19.09.2019 20:49

@Kevin Jurkowski, n => {return + n === + n} возвращает true для: [], [2], [undefined], '', (new Date ()), true и false.

Onno van der Zee 29.02.2020 22:50

NaN означает Not a Number, поэтому, если Number.isNaN(x) истинно, это означает, что x явно не является числом.

Wong Jia Hau 28.04.2020 09:16

Просто указываю, что isNumeric (3) возвращает false. Я имею в виду, что вы должны быть уверены, что аргумент во время выполнения является строкой. Я использую версию из репозитория rxjs: return! Array.isArray (val) && (val - parseFloat (val) + 1)> = 0;

user2010955 07.10.2020 12:48

Есть ли причина, по которой необходимо использовать !isNaN(str) && !isNaN(parseFloat(str))? В каких случаях необходим !isNaN()? Разве не хватило бы только !isNaN(parseFloat(str))?

Barry Chapman 03.02.2021 21:26

!isNaN(parseFloat('1abc')) = true Это будет работать намного лучше: isNumeric = n => !isNaN(parseFloat(n)) && isFinite(n)

Killroy 26.02.2021 12:53

Лучше сначала изменить, как: if (typeof str != "string") return (typeof str == "number");, как если бы данный параметр - это число, которое мы ожидаем увидеть true

S.Serpooshan 08.03.2021 21:54

Ну, я использую тот, который сделал ...

Пока работает:

function checkNumber(value) {
    return value % 1 == 0;
}

Если вы заметили какие-то проблемы, скажите, пожалуйста.

Это дает неправильный результат для пустой строки, пустого массива, false и null.

Ori 18.04.2012 05:23

Разве это не должно быть тройное равенство?

toasted_flakes 09.05.2013 19:44

В моем приложении мы разрешаем только символы a-z, A-Z и 0-9. Я обнаружил, что вышеуказанное сработало, если строка не начинается с 0xnn, а затем она вернет ее как числовую, когда этого не должно быть. Я опубликовал в комментарии ниже, поэтому форматирование не повреждено.

rwheadon 08.07.2014 19:10

вы можете просто сделать 'return value% 1 === 0'

Brian Schermerhorn 11.07.2015 00:42

Просто сделай return !isNaN(parseInt(value, 10));

DarkNeuron 25.10.2019 16:45

Цитировать:

isNaN(num) // returns true if the variable does NOT contain a valid number

не совсем верно, если вам нужно проверить начальные / конечные пробелы - например, когда требуется определенное количество цифр, и вам нужно получить, скажем, '1111', а не '111' или '111', возможно, для PIN-кода Вход.

Лучше использовать:

var num = /^\d+$/.test(num)

Значения '-1', '0.1' и '1e10' возвращают false. Кроме того, значения больше положительной бесконечности или меньше отрицательной бесконечности возвращают истину, хотя они, вероятно, должны возвращать ложь.

Rudey 22.02.2017 23:11

Старый вопрос, но в приведенных ответах упущено несколько моментов.

Научная нотация.

!isNaN('1e+30') - это true, однако в большинстве случаев, когда люди просят цифры, они не хотят совпадать с такими вещами, как 1e+30.

Большие плавающие числа могут вести себя странно

Наблюдайте (используя Node.js):

> var s = Array(16 + 1).join('9')
undefined
> s.length
16
> s
'9999999999999999'
> !isNaN(s)
true
> Number(s)
10000000000000000
> String(Number(s)) === s
false
>

С другой стороны:

> var s = Array(16 + 1).join('1')
undefined
> String(Number(s)) === s
true
> var s = Array(15 + 1).join('9')
undefined
> String(Number(s)) === s
true
>

Итак, если кто-то ожидает String(Number(s)) === s, тогда лучше ограничьте ваши строки максимум 15 цифрами (после исключения ведущих нулей).

бесконечность

> typeof Infinity
'number'
> !isNaN('Infinity')
true
> isFinite('Infinity')
false
>

Учитывая все это, проверка того, что данная строка является числом, удовлетворяющим всем следующим требованиям:

  • ненаучная нотация
  • предсказуемый переход на Number и обратно на String
  • конечный

это не такая уж простая задача. Вот простая версия:

  function isNonScientificNumberString(o) {
    if (!o || typeof o !== 'string') {
      // Should not be given anything but strings.
      return false;
    }
    return o.length <= 15 && o.indexOf('e+') < 0 && o.indexOf('E+') < 0 && !isNaN(o) && isFinite(o);
  }

Однако и этот далеко не полный. Начальные нули здесь не обрабатываются, но они не справляются с проверкой длины.

«однако в большинстве случаев, когда люди просят цифры, они не хотят совпадать с такими вещами, как 1e + 30» Почему вы так говорите? Если кто-то хочет знать, содержит ли строка число, мне кажется, что они хотели бы знать, содержит ли она число, а 1e + 30 - это число. Конечно, если бы я тестировал строку для числового значения в JavaScript, я бы хотел, чтобы это совпадало.

Dan Jones 04.01.2017 20:42

ПФБ рабочий раствор:

 function(check){ 
    check = check + "";
    var isNumber =   check.trim().length>0? !isNaN(check):false;
    return isNumber;
    }

Если вы просто пытаетесь проверить, является ли строка целым числом (без десятичных знаков), регулярное выражение - хороший способ. Другие методы, такие как isNaN, слишком сложны для чего-то столь простого.

    function isNumeric(value) {
        return /^-?\d+$/.test(value);
    }
    
    console.info(isNumeric('abcd'));         // false
    console.info(isNumeric('123a'));         // false
    console.info(isNumeric('1'));            // true
    console.info(isNumeric('1234567890'));   // true
    console.info(isNumeric('-23'));          // true
    console.info(isNumeric(1234));           // true
    console.info(isNumeric('123.4'));        // false
    console.info(isNumeric(''));             // false
    console.info(isNumeric(undefined));      // false
    console.info(isNumeric(null));           // false

Чтобы разрешить только целые числа положительный, используйте это:

    function isNumeric(value) {
        return /^\d+$/.test(value);
    }

    console.info(isNumeric('123'));          // true
    console.info(isNumeric('-23'));          // false

console.info (isNumeric ('- 1'));

yongnan 13.11.2014 04:02

console.info (isNumeric ('2e2'));

Gaël 02.03.2015 18:27

Возможно, просто переименуйте isNumeric в hasOnlyDigits. во многих случаях это именно тот чек, который вы ищете.

gus3001 09.10.2017 23:39

Это то, что я искал, эквивалент php ctype_digit

Miguel Pynto 20.09.2019 14:17

Я думаю это лучший подход

Laszlo Sarvold 17.09.2020 17:06

Это может быть лучше /^-?[0-9.,]+/, если вы хотите разрешить такие значения, как -1.5px

cata-lock 01.10.2020 20:12

Немного лучше ... запретить числовые символы из таких языков, как арабский /^[0-9]+$/.test(value)

Devin Rhode 19.10.2020 21:53

Спасибо; ты спас мне день. Проверка - это такая боль.

marsnebulasoup 15.02.2021 22:27

В моем приложении мы разрешаем только символы a-z, A-Z и 0-9. Я нашел ответ выше, используя "нить% 1 === 0", если строка не начинается с 0xnn (например, 0x10), а затем она вернет ее как числовую, когда мы этого не хотим. Следующая простая ловушка в моей числовой проверке, кажется, помогает в наших конкретных случаях.

function isStringNumeric(str_input){   
    //concat a temporary 1 during the modulus to keep a beginning hex switch combination from messing us up   
    //very simple and as long as special characters (non a-z A-Z 0-9) are trapped it is fine   
    return '1'.concat(str_input) % 1 === 0;}

Предупреждение: Это могло быть использование давней ошибки в Javascript и ActionScript [Number ("1" + the_string)% 1 === 0)], я не могу говорить об этом, но это именно то, что нам нужно.

Почему это может быть ошибка в JavaScript?

Bergi 08.07.2014 19:29

Я просто не вижу такого же поведения с аналогичным решением на perl или C, и, поскольку я не разработчик язык программирования для javascript или actionscript, я не знаю, действительно ли поведение, которое я испытываю, является преднамеренным или нет.

rwheadon 08.07.2014 20:16

Что ж, javascript немного небрежно относится к неявному приведению типов, но как только вы знаете, что вы можете легко понять, как это работает. Вы преобразуете строки в числа (вызывая над ними числовую операцию % 1), и это интерпретирует строку как шестнадцатеричный или плавающий литерал.

Bergi 08.07.2014 20:23

Мое решение:

// returns true for positive ints; 
// no scientific notation, hexadecimals or floating point dots

var isPositiveInt = function(str) { 
   var result = true, chr;
   for (var i = 0, n = str.length; i < n; i++) {
       chr = str.charAt(i);
       if ((chr < "0" || chr > "9") && chr != ",") { //not digit or thousands separator
         result = false;
         break;
       };
       if (i == 0 && (chr == "0" || chr == ",")) {  //should not start with 0 or ,
         result = false;
         break;
       };
   };
   return result;
 };

Вы можете добавить в цикл дополнительные условия в соответствии с вашими потребностями.

Я так делаю:

function isString(value)
{
    return value.length !== undefined;
}
function isNumber(value)
{
    return value.NaN !== undefined;
}

Конечно, здесь будет отключена isString (), если вы передадите какой-либо другой объект, для которого определена длина.

Вы имеете в виду как массив? : - /

mAAdhaTTah 07.05.2015 00:21

Я не уверен, что вы собираетесь делать с помощью метода isNumber. Строки и числа никогда не имеют свойства NaN, это только во встроенной функции конструктора Number.

Justin Morgan 23.01.2019 00:16

Вы можете использовать результат Число при передаче аргумента его конструктору.

Если аргумент (строка) не может быть преобразован в число, он возвращает NaN, поэтому вы можете определить, была ли предоставленная строка допустимым числом или нет.

Примечания. Обратите внимание, что при передаче пустой строки или '\t\t' и '\n\t' в качестве числа будет возвращено 0; Передача true вернет 1, а false - 0.

    Number('34.00') // 34
    Number('-34') // -34
    Number('123e5') // 12300000
    Number('123e-5') // 0.00123
    Number('999999999999') // 999999999999
    Number('9999999999999999') // 10000000000000000 (integer accuracy up to 15 digit)
    Number('0xFF') // 255
    Number('Infinity') // Infinity  

    Number('34px') // NaN
    Number('xyz') // NaN
    Number('true') // NaN
    Number('false') // NaN

    // cavets
    Number('    ') // 0
    Number('\t\t') // 0
    Number('\n\t') // 0

Конструктор Number точно такой же, как +x.

GregRos 29.12.2018 00:56

В качестве побочного примечания имейте в виду, что ES6 Number() также обрабатывает числа с плавающей запятой, например Number.parseFloat(), а не Number.parseInt().

zurfyx 20.01.2020 23:27

Моя попытка немного сбивающего с толку, возможно, не лучшее решение

function isInt(a){
    return a === ""+~~a
}


console.info(isInt('abcd'));         // false
console.info(isInt('123a'));         // false
console.info(isInt('1'));            // true
console.info(isInt('0'));            // true
console.info(isInt('-0'));           // false
console.info(isInt('01'));           // false
console.info(isInt('10'));           // true
console.info(isInt('-1234567890'));  // true
console.info(isInt(1234));           // false
console.info(isInt('123.4'));        // false
console.info(isInt(''));             // false

// other types then string returns false
console.info(isInt(5));              // false
console.info(isInt(undefined));      // false
console.info(isInt(null));           // false
console.info(isInt('0x1'));          // false
console.info(isInt(Infinity));       // false

Это не так уж и плохо, два плохих, что он не работает для любой недесятичной нотации, такой как (1) научная запись и (2) нотация не с основанием 10, например восьмеричная (042) и шестнадцатеричная (0x45f)

Domi 29.04.2017 11:58

Это не отвечает на вопрос о поиске числового значения, он ищет только int.

Jeremy 26.10.2019 00:53

Если вы действительно хотите убедиться, что строка содержит только число, любое число (целое или с плавающей запятой) и точное число, вы не могу используете сами по себе parseInt() / parseFloat(), Number() или !isNaN(). Обратите внимание, что !isNaN() фактически возвращает true, когда Number() возвращает число, и false, когда он возвращает NaN, поэтому я исключу его из остальной части обсуждения.

Проблема с parseFloat() заключается в том, что он вернет число, если строка содержит любое число, даже если строка не содержит Только и точно число:

parseFloat("2016-12-31")  // returns 2016
parseFloat("1-1") // return 1
parseFloat("1.2.3") // returns 1.2

Проблема с Number() в том, что он вернет число в тех случаях, когда переданное значение вообще не является числом!

Number("") // returns 0
Number(" ") // returns 0
Number(" \u00A0   \t\n\r") // returns 0

Проблема с вращением собственного регулярного выражения заключается в том, что, если вы не создадите точное регулярное выражение для сопоставления числа с плавающей запятой, поскольку Javascript распознает его, вы пропустите случаи или распознаете случаи, в которых вы не должны. И даже если вы можете использовать собственное регулярное выражение, почему? Есть более простые встроенные способы сделать это.

Однако оказывается, что Number()isNaN()) поступает правильно во всех случаях, когда parseFloat() возвращает число, а не должно, и наоборот. Итак, чтобы узнать, действительно ли строка является точной и представляет собой только число, вызовите обе функции и посмотрите, вернут ли они и то и другое true:

function isNumber(str) {
  if (typeof str != "string") return false // we only process strings!
  // could also coerce to string: str = ""+str
  return !isNaN(str) && !isNaN(parseFloat(str))
}

Это возвращает истину, если в строке есть начальные или конечные пробелы. ' 1', '2 ' и ' 3 ' все верны.

Rudey 22.02.2017 23:07

Добавление чего-то вроде этого в оператор возврата решит эту проблему: &&! / ^ \ S + | \ s + $ / g.test (str)

Ultroman the Tacoman 15.05.2017 16:07

@RuudLenders - большинству людей все равно, есть ли конечные пробелы, которые обрезаются, чтобы сделать строку действительным числом, потому что во многих интерфейсах легко случайно вставить лишние пробелы.

Ian 03.11.2017 22:34

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

Rudey 05.11.2017 00:25

Если кто-нибудь когда-нибудь зайдет так далеко, я потратил некоторое время на взлом, пытаясь исправить момент.js (https://github.com/moment/moment). Вот кое-что, что я вынес из него:

function isNumeric(val) {
    var _val = +val;
    return (val !== val + 1) //infinity check
        && (_val === +val) //Cute coercion check
        && (typeof val !== 'object') //Array/object check
}

Обрабатывает следующие случаи:

Правда! :

isNumeric("1"))
isNumeric(1e10))
isNumeric(1E10))
isNumeric(+"6e4"))
isNumeric("1.2222"))
isNumeric("-1.2222"))
isNumeric("-1.222200000000000000"))
isNumeric("1.222200000000000000"))
isNumeric(1))
isNumeric(0))
isNumeric(-0))
isNumeric(1010010293029))
isNumeric(1.100393830000))
isNumeric(Math.LN2))
isNumeric(Math.PI))
isNumeric(5e10))

Ложь! :

isNumeric(NaN))
isNumeric(Infinity))
isNumeric(-Infinity))
isNumeric())
isNumeric(undefined))
isNumeric('[1,2,3]'))
isNumeric({a:1,b:2}))
isNumeric(null))
isNumeric([1]))
isNumeric(new Date()))

Как ни странно, то, с чем я борюсь больше всего:

isNumeric(new Number(1)) => false

Любые предложения приветствуются. :]

А как насчет isNumeric(' ') и isNumeric('')?

Alex Cory 31.01.2017 07:00

Я бы добавил && (val.replace(/\s/g,'') !== '') //Empty && (val.slice(-1) !== '.') //Decimal without Number, чтобы решить вышеупомянутую проблему, и тот, который был у меня сам.

frankenapps 15.01.2018 22:08

Может быть, есть один или два человека, которые сталкиваются с этим вопросом, которым нужна проверка намного строже, чем обычно (как я). В таком случае это может быть полезно:

if (str === String(Number(str))) {
  // it's a "perfectly formatted" number
}

Остерегаться! Это отклонит такие строки, как .1, 40.000, 080, 00.1. Это очень разборчиво - строка должна соответствовать "самая минимальная совершенная форма" числа, чтобы этот тест прошел.

Он использует конструктор String и Number для преобразования строки в число и обратно и, таким образом, проверяет, соответствует ли «идеальная минимальная форма» движка JavaScript (та, в которую он был преобразован с помощью начального конструктора Number) исходной строке.

Спасибо @JoeRocc. Мне это тоже было нужно, но только для целых чисел, поэтому я добавил: (str === String(Math.round(Number(str)))).

keithpjolley 31.05.2017 17:43

Имейте в виду, что "Infinity", "-Infinity" и "NaN" проходят этот тест. Однако это можно исправить с помощью дополнительного теста Number.isFinite.

GregRos 29.12.2018 00:53

Это точно так же, как str === ("" + +str). Он в основном проверяет, является ли строка результатом преобразования номера JS в строку. Зная это, мы также можем увидеть проблему: тест проходит для 0.000001, но не проходит для 0.0000001, то есть тогда, когда 1e-7 проходит. То же самое для очень больших чисел.

GregRos 29.12.2018 01:19

Это неверный ответ. 1e10 «совершенно корректен и отформатирован», но все же не работает с этим алгоритмом.

Ben Aston 02.10.2020 13:52

Я протестировал, и решение Майкла лучше всего. Проголосуйте за его ответ выше (поищите на этой странице «Если вы действительно хотите убедиться, что это строка», чтобы найти ее). По сути, его ответ таков:

function isNumeric(num){
  num = "" + num; //coerce num to be a string
  return !isNaN(num) && !isNaN(parseFloat(num));
}

Он работает для каждого тестового примера, который я описал здесь: https://jsfiddle.net/wggehvp9/5/

Многие другие решения не подходят для этих крайних случаев: '', null, "", true и []. Теоретически вы можете использовать их при правильной обработке ошибок, например:

return !isNaN(num);

или же

return (+num === +num);

со специальной обработкой для / \ s /, null, "", true, false, [] (и другие?)

Это по-прежнему возвращает истину с конечными / ведущими пробелами. Добавление чего-то вроде этого в оператор возврата решит эту проблему: &&! / ^ \ S + | \ s + $ / g.test (str)

Ultroman the Tacoman 15.05.2017 16:13

Значит, «123» должно быть ложным, а не числом, а «1234» должно быть числом? Мне нравится, как это есть, так что «123» - это число, но это может быть на усмотрение разработчика, если начальные или конечные пробелы должны изменить значение.

JohnP2 14.06.2017 22:10

Почему реализация jQuery недостаточно хороша?

function isNumeric(a) {
    var b = a && a.toString();
    return !$.isArray(a) && b - parseFloat(b) + 1 >= 0;
};

Майкл предложил что-то вроде этого (хотя я украл здесь измененную версию "user1691651 - John"):

function isNumeric(num){
    num = "" + num; //coerce num to be a string
    return !isNaN(num) && !isNaN(parseFloat(num));
}

Следующее - решение, скорее всего, с плохой производительностью, но с хорошими результатами. Это хитрое изобретение, созданное на основе реализации jQuery 1.12.4 и ответа Майкла, с дополнительной проверкой на ведущие / конечные пробелы (поскольку версия Майкла возвращает true для чисел с ведущими / конечными пробелами):

function isNumeric(a) {
    var str = a + "";
    var b = a && a.toString();
    return !$.isArray(a) && b - parseFloat(b) + 1 >= 0 &&
           !/^\s+|\s+$/g.test(str) &&
           !isNaN(str) && !isNaN(parseFloat(str));
};

Однако в последней версии есть две новые переменные. Один из них можно обойти, выполнив:

function isNumeric(a) {
    if ($.isArray(a)) return false;
    var b = a && a.toString();
    a = a + "";
    return b - parseFloat(b) + 1 >= 0 &&
            !/^\s+|\s+$/g.test(a) &&
            !isNaN(a) && !isNaN(parseFloat(a));
};

Я не очень много тестировал ни один из них, кроме ручного тестирования нескольких вариантов использования, с которыми я столкнусь с моим текущим затруднительным положением, что все очень стандартно. Это ситуация «стоя на плечах гигантов».

Вы можете использовать типы, такие как библиотека потокаy, для получения статической проверки времени компиляции. Конечно, не очень полезно для пользовательского ввода.

// @flow

function acceptsNumber(value: number) {
  // ...
}

acceptsNumber(42);       // Works!
acceptsNumber(3.14);     // Works!
acceptsNumber(NaN);      // Works!
acceptsNumber(Infinity); // Works!
acceptsNumber("foo");    // Error!

Вот однострочный текст, чтобы проверить, является ли sNum допустимым числовым значением; он был протестирован на большом количестве входов:

!isNaN(+s.replace(/\s|$/g, ''));  // returns True if numeric value

не выполняется для пустой строки ''

gman 12.01.2021 08:41

Мне нравится простота этого.

Number.isNaN(Number(value))

Вышеупомянутый обычный Javascript, но я использую его в сочетании с машинописным текстом Typeguard для интеллектуальной проверки типов. Это очень полезно для компилятора машинописного текста, чтобы дать вам правильный intellisense и исключить ошибки типа.

Машинописные шрифты

isNotNumber(value: string | number): value is string {
    return Number.isNaN(Number(this.smartImageWidth));
}
isNumber(value: string | number): value is number {
    return Number.isNaN(Number(this.smartImageWidth)) === false;
}

Допустим, у вас есть свойство width, которое является number | string. Возможно, вы захотите выполнить логику в зависимости от того, является ли это строкой.

var width: number|string;
width = "100vw";

if (isNotNumber(width)) 
{
    // the compiler knows that width here must be a string
    if (width.endsWith('vw')) 
    {
        // we have a 'width' such as 100vw
    } 
}
else 
{
    // the compiler is smart and knows width here must be number
    var doubleWidth = width * 2;    
}

Typeguard достаточно умен, чтобы ограничить тип width в операторе if ТОЛЬКО string. Это позволяет компилятору разрешить width.endsWith(...), чего он не разрешил бы, если бы тип был string | number.

Вы можете называть typeguard как хотите: isNotNumber, isNumber, isString, isNotString, но я думаю, что isString неоднозначен и труднее читать.

Относительно хорошо работает в обычном JS, но не работает в таких случаях, как 1..1, 1,1, -32.1.12, и, что более важно, не работает с undefined и NaN. Не уверен, что ваш TS компенсирует это, но похоже, что если вы прошли undefined или NaN, он потерпит неудачу при попытке выполнить undefined * 2, который не выйдет из строя, но вернет NaN.

Jeremy 26.10.2019 01:02

Недавно я написал статью о том, как гарантировать, что переменная является допустимым числом: https://github.com/jehugaleahsa/artifacts/blob/master/2018/typescript_num_hack.md В статье объясняется, как обеспечить использование чисел с плавающей запятой или целых чисел, если это важно (+x против ~~x).

В статье предполагается, что переменная - это string или number для начала, и trim доступен / заполнен. Было бы несложно расширить его для обработки и других типов. Вот его суть:

// Check for a valid float
if (x == null
    || ("" + x).trim() === ""
    || isNaN(+x)) {
    return false;  // not a float
}

// Check for a valid integer
if (x == null
    || ("" + x).trim() === ""
    || ~~x !== +x) {
    return false;  // not an integer
}

Принятый ответ на этот вопрос имеет довольно много недостатков (как подчеркнули несколько других пользователей). Это один из самых простых и проверенных способов подойти к нему в javascript:

function isNumeric(n) {
  return !isNaN(parseFloat(n)) && isFinite(n);
}

Ниже приведены несколько хороших тестовых случаев:

console.info(isNumeric(12345678912345678912)); // true
console.info(isNumeric('2 '));                 // true
console.info(isNumeric('-32.2 '));             // true
console.info(isNumeric(-32.2));                // true
console.info(isNumeric(undefined));            // false

// the accepted answer fails at these tests:
console.info(isNumeric(''));                   // false
console.info(isNumeric(null));                 // false
console.info(isNumeric([]));                   // false

parseFloat недостаточен для этого приложения, потому что он вернет действительное число, проанализированное до сих пор, когда оно встречает первый символ, который не может быть проанализирован как число. например. parseFloat('1.1ea10') === 1.1.

Ben Aston 02.10.2020 13:35

Избавьтесь от головной боли от попыток найти «встроенное» решение.

Нет хорошего ответа, и ответ, получивший огромное количество голосов в этой ветке, неверен.

npm install is-number

In JavaScript, it's not always as straightforward as it should be to reliably check if a value is a number. It's common for devs to use +, -, or Number() to cast a string value to a number (for example, when values are returned from user input, regex matches, parsers, etc). But there are many non-intuitive edge cases that yield unexpected results:

console.info(+[]); //=> 0
console.info(+''); //=> 0
console.info(+'   '); //=> 0
console.info(typeof NaN); //=> 'number'

function isNumberCandidate(s) {
  const str = (''+ s).trim();
  if (str.length === 0) return false;
  return !isNaN(+str);
}

console.info(isNumberCandidate('1'));       // true
console.info(isNumberCandidate('a'));       // false
console.info(isNumberCandidate('000'));     // true
console.info(isNumberCandidate('1a'));      // false 
console.info(isNumberCandidate('1e'));      // false
console.info(isNumberCandidate('1e-1'));    // true
console.info(isNumberCandidate('123.3'));   // true
console.info(isNumberCandidate(''));        // false
console.info(isNumberCandidate(' '));       // false
console.info(isNumberCandidate(1));         // true
console.info(isNumberCandidate(0));         // true
console.info(isNumberCandidate(NaN));       // false
console.info(isNumberCandidate(undefined)); // false
console.info(isNumberCandidate(null));      // false
console.info(isNumberCandidate(-1));        // true
console.info(isNumberCandidate('-1'));      // true
console.info(isNumberCandidate('-1.2'));    // true
console.info(isNumberCandidate(0.0000001)); // true
console.info(isNumberCandidate('0.0000001')); // true
console.info(isNumberCandidate(Infinity));    // true
console.info(isNumberCandidate(-Infinity));    // true

console.info(isNumberCandidate('Infinity'));  // true

if (isNumberCandidate(s)) {
  // use +s as a number
  +s ...
}

Спасибо, отличный ответ!

M.Abulsoud 27.03.2019 19:43

Просто используйте isNaN(), это преобразует строку в количество, и при получении действительного количество вернет false ...

isNaN("Alireza"); //return true
isNaN("123"); //return false

Я использую следующее:

const isNumber = s => !isNaN(+s)

Относительно хорошо работает во многих случаях, но не работает в таких случаях, как 1..1, 1,1, -32.1.12, и, что более важно, не работает в undefined и NaN. Если вы прошли undefined или NaN, он вернет вам ложное срабатывание, указав, что это число.

Jeremy 26.10.2019 01:04

При защите от пустых струн и null

// Base cases that are handled properly
Number.isNaN(Number('1')); // => false
Number.isNaN(Number('-1')); // => false
Number.isNaN(Number('1.1')); // => false
Number.isNaN(Number('-1.1')); // => false
Number.isNaN(Number('asdf')); // => true
Number.isNaN(Number(undefined)); // => true

// Special notation cases that are handled properly
Number.isNaN(Number('1e1')); // => false
Number.isNaN(Number('1e-1')); // => false
Number.isNaN(Number('-1e1')); // => false
Number.isNaN(Number('-1e-1')); // => false
Number.isNaN(Number('0b1')); // => false
Number.isNaN(Number('0o1')); // => false
Number.isNaN(Number('0xa')); // => false

// Edge cases that will FAIL if not guarded against
Number.isNaN(Number('')); // => false
Number.isNaN(Number(' ')); // => false
Number.isNaN(Number(null)); // => false

// Edge cases that are debatable
Number.isNaN(Number('-0b1')); // => true
Number.isNaN(Number('-0o1')); // => true
Number.isNaN(Number('-0xa')); // => true
Number.isNaN(Number('Infinity')); // => false 
Number.isNaN(Number('INFINITY')); // => true  
Number.isNaN(Number('-Infinity')); // => false 
Number.isNaN(Number('-INFINITY')); // => true  

Когда НЕ защищает от пустых строк и null

Используя parseInt:

// Base cases that are handled properly
Number.isNaN(parseInt('1')); // => false
Number.isNaN(parseInt('-1')); // => false
Number.isNaN(parseInt('1.1')); // => false
Number.isNaN(parseInt('-1.1')); // => false
Number.isNaN(parseInt('asdf')); // => true
Number.isNaN(parseInt(undefined)); // => true
Number.isNaN(parseInt('')); // => true
Number.isNaN(parseInt(' ')); // => true
Number.isNaN(parseInt(null)); // => true

// Special notation cases that are handled properly
Number.isNaN(parseInt('1e1')); // => false
Number.isNaN(parseInt('1e-1')); // => false
Number.isNaN(parseInt('-1e1')); // => false
Number.isNaN(parseInt('-1e-1')); // => false
Number.isNaN(parseInt('0b1')); // => false
Number.isNaN(parseInt('0o1')); // => false
Number.isNaN(parseInt('0xa')); // => false

// Edge cases that are debatable
Number.isNaN(parseInt('-0b1')); // => false
Number.isNaN(parseInt('-0o1')); // => false
Number.isNaN(parseInt('-0xa')); // => false
Number.isNaN(parseInt('Infinity')); // => true 
Number.isNaN(parseInt('INFINITY')); // => true  
Number.isNaN(parseInt('-Infinity')); // => true 
Number.isNaN(parseInt('-INFINITY')); // => true 

Используя parseFloat:

// Base cases that are handled properly
Number.isNaN(parseFloat('1')); // => false
Number.isNaN(parseFloat('-1')); // => false
Number.isNaN(parseFloat('1.1')); // => false
Number.isNaN(parseFloat('-1.1')); // => false
Number.isNaN(parseFloat('asdf')); // => true
Number.isNaN(parseFloat(undefined)); // => true
Number.isNaN(parseFloat('')); // => true
Number.isNaN(parseFloat(' ')); // => true
Number.isNaN(parseFloat(null)); // => true

// Special notation cases that are handled properly
Number.isNaN(parseFloat('1e1')); // => false
Number.isNaN(parseFloat('1e-1')); // => false
Number.isNaN(parseFloat('-1e1')); // => false
Number.isNaN(parseFloat('-1e-1')); // => false
Number.isNaN(parseFloat('0b1')); // => false
Number.isNaN(parseFloat('0o1')); // => false
Number.isNaN(parseFloat('0xa')); // => false

// Edge cases that are debatable
Number.isNaN(parseFloat('-0b1')); // => false
Number.isNaN(parseFloat('-0o1')); // => false
Number.isNaN(parseFloat('-0xa')); // => false
Number.isNaN(parseFloat('Infinity')); // => false 
Number.isNaN(parseFloat('INFINITY')); // => true  
Number.isNaN(parseFloat('-Infinity')); // => false 
Number.isNaN(parseFloat('-INFINITY')); // => true

Заметки:

  • В соответствии с ответом на исходный вопрос рассматриваются только строковые, пустые и неинициализированные значения. Дополнительные граничные случаи существуют, если рассматриваются массивы и объекты.
  • Символы в двоичной, восьмеричной, шестнадцатеричной и экспоненциальной нотации не чувствительны к регистру (то есть: «0xFF», «0XFF», «0xfF» и т. д. Дадут одинаковый результат в тестовых примерах, показанных выше).
  • В отличие от Infinity (с учетом регистра), в некоторых случаях константы из объектов Number и Math, переданные в виде тестовых примеров в строковом формате любому из вышеперечисленных методов, будут определены как не числа.
  • См. здесь для объяснения того, как аргументы преобразуются в Number и почему существуют крайние случаи для null и пустых строк.

См. Также stackoverflow.com/questions/46677774/…

Philip 13.03.2020 20:26

не работает "", null, undefined и

gman 12.01.2021 08:36

@gman спасибо, что указали на крайние случаи. Я обновил ответ, чтобы адресовать те, которые вы упомянули, а также Infinity и "Infinity". Также похоже, что undefined уже обрабатывается должным образом, но я добавил это явно, чтобы было понятно.

Abtin Gramian 16.01.2021 07:41

Это недействительно для TypeScript, так как:

declare function isNaN(number: number): boolean;

Для TypeScript вы можете использовать:

/^\d+$/.test(key)

/^\d+$/.test("-1") // false Чтобы использовать isNaN с нечисловыми значениями в TS, вы можете просто преобразовать значение в any или использовать одно из других более комплексных решений, которые используют Number, parseFloat и т. д.

John Montgomery 13.07.2020 20:51

Вот высокопроизводительная (2,5 * 10 ^ 7 итераций / с @ 3,8 ГГц Haswell) версия реализации isNumber. Он работает для всех тестов, которые я смог найти (включая символы):

var isNumber = (function () {
  var isIntegerTest = /^\d+$/;
  var isDigitArray = [!0, !0, !0, !0, !0, !0, !0, !0, !0, !0];
  function hasLeading0s (s) {
    return !(typeof s !== 'string' ||
    s.length < 2 ||
    s[0] !== '0' ||
    !isDigitArray[s[1]] ||
    isIntegerTest.test(s));
  }
  var isWhiteSpaceTest = /\s/;
  return function isNumber (s) {
    var t = typeof s;
    var n;
    if (t === 'number') {
      return (s <= 0) || (s > 0);
    } else if (t === 'string') {
      n = +s;
      return !((!(n <= 0) && !(n > 0)) || n === '0' || hasLeading0s(s) || !(n !== 0 || !(s === '' || isWhiteSpaceTest.test(s))));
    } else if (t === 'object') {
      return !(!(s instanceof Number) || ((n = +s), !(n <= 0) && !(n > 0)));
    }
    return false;
  };
})();

2019: Включая примеры ES3, ES6 и TypeScript

Возможно, это было слишком много раз перефразировано, однако сегодня я тоже боролся с этим и хотел опубликовать свой ответ, так как я не видел другого ответа, который делал бы это так просто или тщательно:

ES3

var isNumeric = function(num){
    return (typeof(num) === 'number' || typeof(num) === "string" && num.trim() !== '') && !isNaN(num);  
}

ES6

const isNumeric = (num) => (typeof(num) === 'number' || typeof(num) === "string" && num.trim() !== '') && !isNaN(num);

Машинопись

const isNumeric = (num: any) => (typeof(num) === 'number' || typeof(num) === "string" && num.trim() !== '') && !isNaN(num as number);

Это кажется довольно простым и охватывает все основы, которые я видел во многих других сообщениях и придумал сам:

// Positive Cases
console.info(0, isNumeric(0) === true);
console.info(1, isNumeric(1) === true);
console.info(1234567890, isNumeric(1234567890) === true);
console.info('1234567890', isNumeric('1234567890') === true);
console.info('0', isNumeric('0') === true);
console.info('1', isNumeric('1') === true);
console.info('1.1', isNumeric('1.1') === true);
console.info('-1', isNumeric('-1') === true);
console.info('-1.2354', isNumeric('-1.2354') === true);
console.info('-1234567890', isNumeric('-1234567890') === true);
console.info(-1, isNumeric(-1) === true);
console.info(-32.1, isNumeric(-32.1) === true);
console.info('0x1', isNumeric('0x1') === true);  // Valid number in hex
// Negative Cases
console.info(true, isNumeric(true) === false);
console.info(false, isNumeric(false) === false);
console.info('1..1', isNumeric('1..1') === false);
console.info('1,1', isNumeric('1,1') === false);
console.info('-32.1.12', isNumeric('-32.1.12') === false);
console.info('[blank]', isNumeric('') === false);
console.info('[spaces]', isNumeric('   ') === false);
console.info('null', isNumeric(null) === false);
console.info('undefined', isNumeric(undefined) === false);
console.info([], isNumeric([]) === false);
console.info('NaN', isNumeric(NaN) === false);

Вы также можете попробовать свою собственную функцию isNumeric и просто пройти эти варианты использования и просканировать их на «истинное» значение для всех из них.

Или, чтобы увидеть значения, возвращаемые каждым:

Results of each test against <code>isNumeric()</code>

хорошо, кроме, например, «0x10» (возвращает истину!)

S.Serpooshan 08.03.2021 21:45

2019: Практическая и точная проверка числовой достоверности

Часто «действительное число» означает число Javascript, исключая NaN и Infinity, то есть «конечное число».

Чтобы проверить числовую достоверность значения (например, из внешнего источника), вы можете определить в стиле ESlint Airbnb:

/**
 * Returns true if 'candidate' is a finite number or a string referring (not just 'including') a finite number
 * To keep in mind:
 *   Number(true) = 1
 *   Number('') = 0
 *   Number("   10  ") = 10
 *   !isNaN(true) = true
 *   parseFloat('10 a') = 10
 *
 * @param {?} candidate
 * @return {boolean}
 */
function isReferringFiniteNumber(candidate) {
  if (typeof (candidate) === 'number') return Number.isFinite(candidate);
  if (typeof (candidate) === 'string') {
    return (candidate.trim() !== '') && Number.isFinite(Number(candidate));
  }
  return false;
}

и используйте его так:

if (isReferringFiniteNumber(theirValue)) {
  myCheckedValue = Number(theirValue);
} else {
  console.warn('The provided value doesn\'t refer to a finite number');
}

Превосходно. Спасибо! ?

GollyJer 26.07.2020 20:41

Это основано на некоторых предыдущих ответах и ​​комментариях. Следующее охватывает все крайние случаи и также довольно кратко:

const isNumRegEx = /^-?(\d*\.)?\d+$/;

function isNumeric(n, allowScientificNotation = false) {
    return allowScientificNotation ? 
                !Number.isNaN(parseFloat(n)) && Number.isFinite(n) :
                isNumRegEx.test(n);
}

Это, кажется, улавливает, казалось бы, бесконечное количество крайних случаев:

function isNumber(x, noStr) {
    /*

        - Returns true if x is either a finite number type or a string containing only a number
        - If empty string supplied, fall back to explicit false
        - Pass true for noStr to return false when typeof x is "string", off by default

        isNumber(); // false
        isNumber([]); // false
        isNumber([1]); // false
        isNumber([1,2]); // false
        isNumber(''); // false
        isNumber(null); // false
        isNumber({}); // false
        isNumber(true); // false
        isNumber('true'); // false
        isNumber('false'); // false
        isNumber('123asdf'); // false
        isNumber('123.asdf'); // false
        isNumber(undefined); // false
        isNumber(Number.POSITIVE_INFINITY); // false
        isNumber(Number.NEGATIVE_INFINITY); // false
        isNumber('Infinity'); // false
        isNumber('-Infinity'); // false
        isNumber(Number.NaN); // false
        isNumber(new Date('December 17, 1995 03:24:00')); // false
        isNumber(0); // true
        isNumber('0'); // true
        isNumber(123); // true
        isNumber(123.456); // true
        isNumber(-123.456); // true
        isNumber(-.123456); // true
        isNumber('123'); // true
        isNumber('123.456'); // true
        isNumber('.123'); // true
        isNumber(.123); // true
        isNumber(Number.MAX_SAFE_INTEGER); // true
        isNumber(Number.MAX_VALUE); // true
        isNumber(Number.MIN_VALUE); // true
        isNumber(new Number(123)); // true
    */

    return (
        (typeof x === 'number' || x instanceof Number || (!noStr && x && typeof x === 'string' && !isNaN(x))) &&
        isFinite(x)
    ) || false;
};

Я использовал эту функцию как инструмент проверки формы, и я не хотел, чтобы пользователи могли писать экспоненциальную функцию, поэтому я придумал эту функцию:

<script>

    function isNumber(value, acceptScientificNotation) {

        if (true !== acceptScientificNotation){
            return /^-{0,1}\d+(\.\d+)?$/.test(value);
        }

        if (true === Array.isArray(value)) {
            return false;
        }
        return !isNaN(parseInt(value, 10));
    }


    console.info(isNumber(""));              // false
    console.info(isNumber(false));           // false
    console.info(isNumber(true));            // false
    console.info(isNumber("0"));             // true
    console.info(isNumber("0.1"));           // true
    console.info(isNumber("12"));            // true
    console.info(isNumber("-12"));           // true
    console.info(isNumber(-45));             // true
    console.info(isNumber({jo: "pi"}));      // false
    console.info(isNumber([]));              // false
    console.info(isNumber([78, 79]));        // false
    console.info(isNumber(NaN));             // false
    console.info(isNumber(Infinity));        // false
    console.info(isNumber(undefined));       // false
    console.info(isNumber("0,1"));           // false



    console.info(isNumber("1e-1"));          // false
    console.info(isNumber("1e-1", true));    // true
</script>

Итак, это будет зависеть от тестовых случаев, которые вы хотите обработать.

function isNumeric(number) {
  return !isNaN(parseFloat(number)) && !isNaN(+number);
}

Я искал обычные типы чисел в javascript. 0, 1 , -1, 1.1 , -1.1 , 1E1 , -1E1 , 1e1 , -1e1, 0.1e10, -0.1.e10 , 0xAF1 , 0o172, Math.PI, Number.NEGATIVE_INFINITY, Number.POSITIVE_INFINITY

А также они представлены в виде строк:
'0', '1', '-1', '1.1', '-1.1', '1E1', '-1E1', '1e1', '-1e1', '0.1e10', '-0.1.e10', '0xAF1', '0o172'

Я действительно хотел исключить и не отмечать их как числовые '', ' ', [], {}, null, undefined, NaN

На сегодняшний день все остальные ответы, похоже, не прошли один из этих тестовых примеров.

Другие вопросы по теме