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

1192

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

Electrons_Ahoy
источник
3
Смотрите этот связанный вопрос , который я задал некоторое время назад.
Майкл Харен
38
Если вы переходите к этому вопросу, попробуйте пропустить все ответы RegEx. Это просто НЕ способ сделать это.
Джоэл Коухорн
14
Если кто-то не хочет делать именно это: проверить, имеет ли данная строка формат действительного потока цифр. Почему это должно быть неправильно тогда?
SasQ
17
Выбранный ответ неверен !!! Смотрите свои комментарии, но в основном это не удается, например , с isNaN(""), isNaN(" "), isNaN(false)и т.д. Он возвращается falseдля них, это означает , что они являются числами.
Андрей
1
поэтому выбранный ответ неверен, регулярное выражение также не способ сделать это. Какой из них правильный тогда?
Вир нас

Ответы:

2323

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

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

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

Чтобы преобразовать строку свободно в число

Полезно для преобразования 12px в 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
Дэн
источник
133
Очень важное замечание о parseInt заключается в том, что он позволит вам указать основание для преобразования строки в int. Это большой вопрос, так как он пытается угадать для вас основание, если вы его не поставите. Так, например: parseInt ("17") дает 17 (десятичное, 10), а parseInt ("08") - 0 (восьмеричное, 8). Таким образом, если вы не намерены иначе, безопаснее всего использовать parseInt (число 10), явно указав 10 как основание.
Адам Рене
36
Обратите внимание, что! IsNaN (undefined) возвращает false.
Дэвид Хеллсинг
111
Это просто неправильно - как он получил так много голосов? Вы не можете использовать isNaN«Чтобы проверить, не является ли переменная числом». «не число» - это не то же самое, что «IEEE-794 NaN», для чего и проводится isNaNпроверка. В частности, это использование не выполняется, по крайней мере, при тестировании логических значений и пустых строк. См. Developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… .
EML
46
Самым быстрым способом проверить, является ли число числом, является проверка «равно себе»: var n = 'a'; if (+n === +n) { // is number }она на ~ 3994% быстрее, чем isNaN в последней версии Chrome. Смотрите тест производительности здесь: jsperf.com/isnan-vs-typeof/5
Кевин Юрковски,
22
** Предупреждение ** Этот ответ неверный. Используйте на свой риск. Пример:isNaN(1 + false + parseInt("1.do you trust your users?"))
keithpjolley
55

И вы могли бы пойти RegExp-путь:

var num = "987238";

if(num.match(/^-{0,1}\d+$/)){
  //valid integer (positive or negative)
}else if(num.match(/^\d+\.\d+$/)){
  //valid float
}else{
  //not valid number
}
roenving
источник
40
В этом случае RegExp == плохо
Джоэл Коухорн
10
Это не работает с шестнадцатеричными числами (например, 0x12), с плавающей запятой без начального нуля (например, .42) и отрицательных чисел.
Ори
17
@JoelCoehoorn Хотите уточнить, почему RegExp == здесь плохо? Кажется, является действительным вариантом использования для меня.
computrius
6
Существует больше способов, чем кажется, чтобы построить число (шестнадцатеричные числа в другом комментарии - только один пример), и есть много чисел, которые могут не считаться действительными (переполнение типа, слишком точное и т. Д.). Кроме того, регулярное выражение является более медленным и более сложным, чем просто использование встроенных механизмов
Джоэл Кохорн
1
также должны соответствовать научным обозначениям ... 1e10 и т. д.
Джозеф Мердриньяк
51

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

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

console.log(isNumeric('abcd'));         // false
console.log(isNumeric('123a'));         // false
console.log(isNumeric('1'));            // true
console.log(isNumeric('1234567890'));   // true
console.log(isNumeric('-23'));          // true
console.log(isNumeric(1234));           // true
console.log(isNumeric('123.4'));        // false
console.log(isNumeric(''));             // false
console.log(isNumeric(undefined));      // false
console.log(isNumeric(null));           // false

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

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

console.log(isNumeric('123'));          // true
console.log(isNumeric('-23'));          // false
Gavin
источник
11
console.log (IsNumeric ( '- 1'));
Юньнань
5
console.log (IsNumeric ( '2e2'));
Гаэль Барбин
11
Возможно, просто переименуйте "isNumeric" в "hasOnlyDigits". во многих случаях это именно тот чек, который вы ищете.
gus3001
1
Это то, что я искал, эквивалент php ctype_digit
Miguel Pynto
/^-?\d+$/правильно?
Суким
36

Если вы действительно хотите , чтобы убедиться сделать , что строка содержит только число, любое число (целое или с плавающей точкой), а именно номер, вы не можете использовать 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))
}
Майкл
источник
2
Это возвращает true, когда строка имеет начальные или конечные пробелы. ' 1', '2 'И ' 3 'все возвращает истину.
Rudey
Добавление чего-то подобного к выражению return решило бы следующее: &&! / ^ \ S + | \ s + $ / g.test (str)
Ультроман Такоман
2
@RuudLenders - большинству людей будет все равно, если есть пробелы, которые обрезаются, чтобы сделать строку допустимым числом, потому что ее легко случайно вставить в дополнительные пробелы во многих интерфейсах.
Ян
3
Это верно в случае, если числовая строка поступает из пользовательского ввода. Но я все равно решил упомянуть пробелы, потому что я думаю, что большинство людей, которым нужна isNumberфункция, не имеют дело с пользовательскими интерфейсами. Кроме того, хороший ввод числа не позволяет пробелы начинаться с.
Рудей
36

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

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

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

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

// the accepted answer fails at these tests:
console.log(isNumeric(''));                   // false
console.log(isNumeric(null));                 // false
console.log(isNumeric([]));                   // false
Хамзин Хамим
источник
22

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

Функция isNaN () определяет, является ли значение недопустимым числом (Not-a-Number).

Эта функция возвращает true, если значение равно NaN. В противном случае возвращается false.

Эта функция отличается от метода Number.isNaN () для конкретного номера .

  Глобальная функция isNaN () преобразует проверенное значение в число, а затем проверяет его.

Number.isNan () не преобразует значения в Number и не возвращает true для любого значения, которое не относится к типу Number ...

theraccoonbear
источник
2
Убедитесь, что вы добавили проверку для пустой строки. isNaN ('') возвращает false, но вы, вероятно, хотите, чтобы он возвращал true в этом случае.
Майкл Харен
3
isFinite - лучший чек - он имеет дело с загадочным угловым случаем Infinity
JonnyRaa
3
@MichaelHaren Не достаточно хорошо! isNaN()возвращает falseдля ЛЮБОЙ строки, содержащей только пробельные символы, включая такие вещи, как '\ u00A0'.
Майкл
1
ВНИМАНИЕ: Не работает для значений: null, "" (пустая строка) и false.
Дженни О'Рейли
Я понимаю, что этот ответ был дан 11 лет назад и за несколько минут до принятого, но нравится это или нет, но принятый ответ имеет ОЧЕНЬ больше разговоров, так что этот ответ на самом деле ничего не добавляет к ответу на вопрос. Я хотел бы предложить удалить его, чтобы не отвлекать новых читателей. Я также думаю, что вы получите значок дисциплины, если вы это сделаете.
Дан Даскалеску
14

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

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

!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);
  }

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

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

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

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, [] (и других?)

JohnP2
источник
1
Это все еще возвращает истину с конечными / ведущими пробелами. Добавление чего-то подобного к выражению return решило бы следующее: &&! / ^ \ S + | \ s + $ / g.test (str)
Ультроман Такоман
2
Таким образом, «123» должно быть ложным, а не числом, а «1234» должно быть числом? Мне нравится, как это так, что «123» является числом, но это может быть на усмотрение разработчика, если начальные или конечные пробелы должны изменить значение.
JohnP2
8

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

Если аргумент (строка) не может быть преобразован в число, он возвращает 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
GibboK
источник
NumberКонструктор точно так же , как и +x.
GregRos
Как примечание стороны, имейте в виду, что ES6 также Number()обрабатывает числа с плавающей точкой, как Number.parseFloat()нетNumber.parseInt()
zurfyx
7

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

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

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

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


источник
2
Спасибо @JoeRocc. Я нуждался в этом тоже, но только для целых чисел, так что я добавил: (str === String(Math.round(Number(str)))).
Keithpjolley
Имейте в виду , что "Infinity", "-Infinity"и "NaN"пройти этот тест. Однако это можно исправить с помощью дополнительного Number.isFiniteтеста.
GregRos
Это точно так же, как str === ("" + +str). Он в основном проверяет, является ли строка результатом строкового числа JS. Зная это, мы также можем увидеть проблему: тест проходит, 0.000001но не проходит 0.0000001, то есть когда 1e-7проходит вместо. То же самое для очень больших чисел.
GregRos
5

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

liggett78
источник
И 11 за parseInt(09).
Джечлин
10
потому что вам нужно использоватьparaseInt(09, 10)
Гэвин
1
Начиная с ECMAScript 5 , который имеет широкую поддержку браузера (IE≥9), вам больше не нужен , 10аргумент. parseInt('09')теперь равно 9.
Рори О'Кейн
4

Quote:

isNaN (num) // возвращает true, если переменная НЕ содержит действительное число

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

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

var num = /^\d+$/.test(num)
Siubear
источник
Значения '-1', '0.1'и '1e10'все возвращается ложь. Кроме того, значения больше положительной бесконечности или меньше отрицательной бесконечности возвращают true, в то время как они, вероятно, должны возвращать false.
Rudey
4

Почему реализация 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));
};

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

Ультроман Такоман
источник
4

Это недопустимо для TypeScript как:

declare function isNaN(number: number): boolean;

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

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

Грег Воз
источник
3

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

Это работает до сих пор:

function checkNumber(value) {
    if ( value % 1 == 0 )
    return true;
    else
    return false;
}

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

Рафаэль
источник
12
Это дает неверный результат для пустой строки, пустого массива, false и null.
Ори
2
Разве это не должно быть тройным равным?
toasted_flakes
1
В моем приложении мы допускаем только символы AZ и 0-9. Я обнаружил, что вышеприведенное сработало, если строка не начиналась с 0xnn, а затем возвращала бы ее как числовую, когда этого не должно быть. Я разместил комментарий ниже, поэтому форматирование не повреждено.
Rhheadon
6
Вы могли бы просто сделать «возвращаемое значение% 1 === 0»
Брайан Шермерхорн
Просто сделайreturn !isNaN(parseInt(value, 10));
DarkNeuron
3

Если кто-нибудь когда-нибудь зайдет так далеко, я потратил некоторое время на то, чтобы попытаться исправить patch.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

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

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

Используя простой JavaScript:

Number.isNaN(Number('1')); // false
Number.isNaN(Number('asdf')); // true

Используя Lodash:

_.isNaN(_.toNumber('1')); // false
_.isNaN(_.toNumber('asdf')); // true
Абтин Грамян
источник
См. Также stackoverflow.com/questions/46677774/…
Филипп
3
function isNumberCandidate(s) {
  const str = (''+ s).trim();
  if (str.length === 0) return false;
  return !isNaN(+str);
}

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

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

if (isNumberCandidate(s)) {
  // use +s as a number
  +s ...
}
gvlax
источник
Спасибо, отличный ответ!
М.Абулсуд,
3

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.log(0, isNumeric(0) === true);
console.log(1, isNumeric(1) === true);
console.log(1234567890, isNumeric(1234567890) === true);
console.log('1234567890', isNumeric('1234567890') === true);
console.log('0', isNumeric('0') === true);
console.log('1', isNumeric('1') === true);
console.log('1.1', isNumeric('1.1') === true);
console.log('-1', isNumeric('-1') === true);
console.log('-1.2354', isNumeric('-1.2354') === true);
console.log('-1234567890', isNumeric('-1234567890') === true);
console.log(-1, isNumeric(-1) === true);
console.log(-32.1, isNumeric(-32.1) === true);
console.log('0x1', isNumeric('0x1') === true);  // Valid number in hex
// Negative Cases
console.log(true, isNumeric(true) === false);
console.log(false, isNumeric(false) === false);
console.log('1..1', isNumeric('1..1') === false);
console.log('1,1', isNumeric('1,1') === false);
console.log('-32.1.12', isNumeric('-32.1.12') === false);
console.log('[blank]', isNumeric('') === false);
console.log('[spaces]', isNumeric('   ') === false);
console.log('null', isNumeric(null) === false);
console.log('undefined', isNumeric(undefined) === false);
console.log([], isNumeric([]) === false);
console.log('NaN', isNumeric(NaN) === false);

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

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

Результаты каждого теста для <code> isNumeric () </ code>

Джереми
источник
3

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');
}
JP Duvet
источник
2

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

 function(check){ 
    check = check + "";
    var isNumber =   check.trim().length>0? !isNaN(check):false;
    return isNumber;
    }
Predhin
источник
2

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

Там нет хорошего ответа, и крайне недооцененный ответ в этой теме является неправильным.

npm install is-number

В JavaScript это не всегда так просто, как следует проверять, является ли значение числом. Обычно разработчики используют +, - или Number () для приведения строкового значения к числу (например, когда значения возвращаются из пользовательского ввода, совпадений регулярных выражений, анализаторов и т. Д.). Но есть много неинтуитивных крайних случаев, которые дают неожиданные результаты:

console.log(+[]); //=> 0
console.log(+''); //=> 0
console.log(+'   '); //=> 0
console.log(typeof NaN); //=> 'number'
cdeutsch
источник
1

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

В статье предполагается, что переменная a stringили a 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
}
Трэвис Паркс
источник
1

Моя попытка немного сбить с толку, Pherhaps не лучшее решение

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


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

// other types then string returns false
console.log(isInt(5));              // false
console.log(isInt(undefined));      // false
console.log(isInt(null));           // false
console.log(isInt('0x1'));          // false
console.log(isInt(Infinity));       // false
Бесконечный
источник
Это не так уж плохо, два плохих, это не работает ни для одной не десятичной записи, такой как (1) научная запись и (2) запись не-base-10, такая как octal ( 042) и hexadecimal ( 0x45f)
Domi
Это не отвечает на вопрос о поиске числового значения, а только ищет int.
Джереми
0

В моем приложении мы допускаем только символы AZ и 0-9. Я нашел ответ выше с использованием « string % 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)], я не могу за это говорить, но это именно то, что нам нужно.

rwheadon
источник
Почему это будет ошибка в JavaScript?
Берги
Я просто не вижу того же поведения с аналогичным решением в Perl или C, и, поскольку я не являюсь разработчиком языка программирования для JavaScript или ActionScript, я не знаю, является ли поведение, которое я испытываю, действительно намеренным или нет.
rwheadon
Что ж, javascript немного небрежно относится к неявному приведению типов, но как только вы поймете, что вы легко поймете, как это работает. Вы приводите строки к числам (вызывая для них числовую % 1операцию), и это будет интерпретировать строку как шестнадцатеричный или плавающий литерал.
Берги
0

Мое решение:

// 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;
 };

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

Перейти к
источник
0

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

// @flow

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

acceptsNumber(42);       // Works!
acceptsNumber(3.14);     // Works!
acceptsNumber(NaN);      // Works!
acceptsNumber(Infinity); // Works!
acceptsNumber("foo");    // Error!
Что бы круто
источник
0

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

!isNaN(+s.replace(/\s|\$/g, ''));  // returns True if numeric value
жизненный баланс
источник
0

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

isNaN("Alireza"); //return true
isNaN("123"); //return false
Алиреза
источник
0

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

const isNumber = s => !isNaN(+s)
haxpanel
источник
Работает достаточно хорошо это много случаев, но терпит неудачу дела , как 1..1, 1,1, -32.1.12и , что более важно не удается undefinedи NaN. Если вы передадите undefinedили a, NaNто это вернет вам ложное срабатывание, говорящее, что это число
Джереми