Проверка десятичных чисел в 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 ]

3 голосов
/ 12 февраля 2011

Мое решение,

function isNumeric(input) {
    var number = /^\-{0,1}(?:[0-9]+){0,1}(?:\.[0-9]+){0,1}$/i;
    var regex = RegExp(number);
    return regex.test(input) && input.length>0;
}

Кажется, это работает в любой ситуации, но я могу ошибаться.

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

Пара тестов для добавления:

IsNumeric('01.05') => false
IsNumeric('1.') => false
IsNumeric('.') => false

Я придумал это:

function IsNumeric(input) {
    return /^-?(0|[1-9]\d*|(?=\.))(\.\d+)?$/.test(input);
}

Решение охватывает:

  • Необязательный отрицательный знак в начале
  • Один ноль или одна или несколько цифр, не начинающихся с 0, или ничего, если период следует за
  • Период, за которым следуют 1 или более чисел
3 голосов
/ 10 апреля 2016

Чтобы проверить, содержит ли переменная правильное число, а не просто строка, которая выглядит как число, Number.isFinite(value) можно использовать.

Это часть языка, так как ES2015

Примеры:

Number.isFinite(Infinity)   // false
Number.isFinite(NaN)        // false
Number.isFinite(-Infinity)  // false

Number.isFinite(0)          // true
Number.isFinite(2e64)       // true

Number.isFinite('0')        // false
Number.isFinite(null)       // false
2 голосов
/ 27 февраля 2013

knockoutJs Встроенные функции проверки библиотеки

Расширяя его, поле проверяется

1) номер

self.number = ko.observable(numberValue) .extend ({number: true}) ;

TestCase

numberValue = '0.0'    --> true
numberValue = '0'      --> true
numberValue = '25'     --> true
numberValue = '-1'     --> true
numberValue = '-3.5'   --> true
numberValue = '11.112' --> true
numberValue = '0x89f'  --> false
numberValue = ''       --> false
numberValue = 'sfsd'   --> false
numberValue = 'dg##$'  --> false

2) цифра

self.number = ko.observable(numberValue) .extend ({цифра: правда}) ;

TestCase

numberValue = '0'      --> true
numberValue = '25'     --> true
numberValue = '0.0'    --> false
numberValue = '-1'     --> false
numberValue = '-3.5'   --> false
numberValue = '11.112' --> false
numberValue = '0x89f'  --> false
numberValue = ''       --> false
numberValue = 'sfsd'   --> false
numberValue = 'dg##$'  --> false

3) мин и макс

self.number = ko.observable(numberValue) .extend ({мин: 5}). Удлинение ({макс: 10}) ;

Это поле может принимать значения только от 5 до 10

TestCase

numberValue = '5'    --> true
numberValue = '6'    --> true
numberValue = '6.5'  --> true
numberValue = '9'    --> true
numberValue = '11'   --> false
numberValue = '0'    --> false
numberValue = ''    --> false
2 голосов
/ 23 февраля 2017

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

$('.number').on('input',function(){
    var n=$(this).val().replace(/ /g,'').replace(/\D/g,'');
    if (!$.isNumeric(n))
        $(this).val(n.slice(0, -1))
    else
        $(this).val(n)
});
2 голосов
/ 16 июня 2012

Я использую более простое решение:

function isNumber(num) {
    return parseFloat(num).toString() == num
}
2 голосов
/ 14 апреля 2014

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

следует отметить, что предполагается, что «.42» - это НЕ число, а «4.» НЕ является числом, поэтому это следует учитывать.

function isDecimal(x) {
  return '' + x === '' + +x;
}

function isInteger(x) {
  return '' + x === '' + parseInt(x);
}

isDecimal проходит следующий тест:

function testIsNumber(f) {
  return f('-1') && f('-1.5') && f('0') && f('0.42')
    && !f('.42') && !f('99,999') && !f('0x89f')
    && !f('#abcdef') && !f('1.2.3') && !f('') && !f('blah');
}

Идея в том, что каждое число или целое число имеет одно «каноническое» строковое представление, и каждое неканоническое представление должно быть отклонено. Таким образом, мы приводим число и обратно и видим, является ли результат исходной строкой.

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

Это актуально, например, для чисел в качестве имен свойств объекта.

var obj = {};
obj['4'] = 'canonical 4';
obj['04'] = 'alias of 4';
obj[4];  // prints 'canonical 4' to the console.
2 голосов
/ 22 июня 2016

Я думаю, что функция parseFloat может сделать всю работу здесь. Функция ниже проходит все тесты на этой странице, включая isNumeric(Infinity) == true:

function isNumeric(n) {

    return parseFloat(n) == n;
}
2 голосов
/ 10 августа 2016
function inNumeric(n){
   return Number(n).toString() === n;
}

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

1 голос
/ 21 декабря 2013

Следующее, кажется, работает хорошо для многих случаев:

function isNumeric(num) {
    return (num > 0 || num === 0 || num === '0' || num < 0) && num !== true && isFinite(num);
}

Это построено поверх этого ответа (который также предназначен для этого ответа): https://stackoverflow.com/a/1561597/1985601

...