Проверка десятичных чисел в JavaScript - IsNumeric () - PullRequest
2264 голосов
/ 20 августа 2008

Какой самый чистый и эффективный способ проверки десятичных чисел в JavaScript?

Бонусные баллы за:

  1. Clarity. Решение должно быть чистым и простым.
  2. Кросс-платформенный.

Контрольные примеры:

01. IsNumeric('-1')      => true
02. IsNumeric('-1.5')    => true
03. IsNumeric('0')       => true
04. IsNumeric('0.42')    => true
05. IsNumeric('.42')     => true
06. IsNumeric('99,999')  => false
07. IsNumeric('0x89f')   => false
08. IsNumeric('#abcdef') => false
09. IsNumeric('1.2.3')   => false
10. IsNumeric('')        => false
11. IsNumeric('blah')    => false

Ответы [ 48 ]

7 голосов
/ 13 января 2014

Я понимаю, что в оригинальном вопросе не упоминалось jQuery, но если вы используете jQuery, вы можете сделать:

$.isNumeric(val)

Simple.

https://api.jquery.com/jQuery.isNumeric/ (по состоянию на jQuery 1.7)

6 голосов
/ 12 июня 2012

Если я не ошибаюсь, это должно соответствовать любому действительному значению числа JavaScript, исключая константы (Infinity, NaN) и операторы знака + / - (потому что они на самом деле не являются частью число, насколько мне известно, это отдельные операторы):

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

/^(?:(?:(?:[1-9]\d*|\d)\.\d*|(?:[1-9]\d*|\d)?\.\d+|(?:[1-9]\d*|\d)) 
(?:[e]\d+)?|0[0-7]+|0x[0-9a-f]+)$/i

Действительные числа будут включать:

 - 0
 - 00
 - 01
 - 10
 - 0e1
 - 0e01
 - .0
 - 0.
 - .0e1
 - 0.e1
 - 0.e00
 - 0xf
 - 0Xf

Неверные числа будут

 - 00e1
 - 01e1
 - 00.0
 - 00x0
 - .
 - .e0
6 голосов
/ 28 января 2011
return (input - 0) == input && input.length > 0;

не работал для меня. Когда я поставил предупреждение и проверил, input.length было undefined. Я думаю, что нет свойства для проверки целочисленной длины. Так что я сделал

var temp = '' + input;
return (input - 0) == input && temp.length > 0;

Работало нормально.

5 голосов
/ 07 июня 2013

Единственная проблема, с которой я столкнулся при ответе @ CMS , - исключение NaN и Бесконечности, которые являются полезными числами для многих ситуаций. Один из способов проверки NaN - проверка числовых значений, которые не равны между собой, NaN != NaN! Итак, на самом деле есть 3 теста, с которыми вы хотели бы иметь дело ...

function isNumber(n) {
  n = parseFloat(n);
  return !isNaN(n) || n != n;
}
function isFiniteNumber(n) {
  n = parseFloat(n);
  return !isNaN(n) && isFinite(n);
}    
function isComparableNumber(n) {
  n = parseFloat(n);
  return (n >=0 || n < 0);
}

isFiniteNumber('NaN')
false
isFiniteNumber('OxFF')
true
isNumber('NaN')
true
isNumber(1/0-1/0)
true
isComparableNumber('NaN')
false
isComparableNumber('Infinity')
true

Мой isComparableNumber довольно близок к другому элегантному ответу , но обрабатывает шестнадцатеричные и другие строковые представления чисел.

5 голосов
/ 28 мая 2010

Для меня это лучший способ:

isNumber : function(v){
   return typeof v === 'number' && isFinite(v);
}
4 голосов
/ 10 июня 2011

Целочисленное значение можно проверить по:

function isNumeric(value) {
    var bool = isNaN(+value));
    bool = bool || (value.indexOf('.') != -1);
    bool = bool || (value.indexOf(",") != -1);
    return !bool;
};

Этот способ проще и быстрее! Все тесты проверены!

4 голосов
/ 20 мая 2013

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

function isNumeric(val) {
    return !isNaN(+val) && isFinite(val);
}

Недостатком версии jQuery является то, что если вы передадите строку с начальными цифрами и конечными буквами, такими как "123abc", parseFloat | parseInt извлечет числовую дробь и вернет 123, НО, второй защитник isFinite не сможет его тем не мение. С унарным оператором + он умрет на самом первом страже, так как + выбрасывает NaN для таких гибридов :) Небольшая производительность, но я думаю, что сплошной смысловой выигрыш.

4 голосов
/ 20 августа 2008

Я хотел бы добавить следующее:

1. IsNumeric('0x89f') => true
2. IsNumeric('075') => true

Положительные шестнадцатеричные числа начинаются с 0x, а отрицательные шестнадцатеричные числа начинаются с -0x. Положительные октавы начинаются с 0, а отрицательные октавы начинаются с -0. Это принимает большинство из того, что уже было упомянуто, но включает шестнадцатеричные и восьмеричные числа, отрицательное научное, Бесконечность и удаляет десятичное научное (4e3.2 недействительно).

function IsNumeric(input){
  var RE = /^-?(0|INF|(0[1-7][0-7]*)|(0x[0-9a-fA-F]+)|((0|[1-9][0-9]*|(?=[\.,]))([\.,][0-9]+)?([eE]-?\d+)?))$/;
  return (RE.test(input));
}
3 голосов
/ 06 декабря 2010

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

        function isNumeric(n)
        {
            var n2 = n;
            n = parseFloat(n);
            return (n!='NaN' && n2==n);
        }

Разъяснения:

Создайте свою собственную копию, затем преобразуйте число в число с плавающей точкой, затем сравните себя с исходным числом, если оно все еще число (целое или с плавающей точкой), и совпадает с исходным числом, то есть оно действительно номер.

Работает как с числовыми строками, так и с простыми числами. Не работает с шестнадцатеричными числами.

Предупреждение: используйте на свой страх и риск, без гарантий.

3 голосов
/ 23 декабря 2014

Ни один из ответов не возвращает false для пустых строк, исправление для этого ...

function is_numeric(n)
{
 return (n != '' && !isNaN(parseFloat(n)) && isFinite(n));
}
...