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

1 голос
/ 27 сентября 2013

Я выполнил следующее ниже, и он прошел все тестовые случаи ...

Используется другой способ, которым parseFloat и Number обрабатывают свои входные данные ...

function IsNumeric(_in) {
    return (parseFloat(_in) === Number(_in) && Number(_in) !== NaN);
}
1 голос
/ 26 января 2019

Простое и понятное решение, использующее динамическую проверку типов языка:

function IsNumeric (string) {
   if(string === ' '.repeat(string.length)){
     return false
   }
   return string - 0 === string * 1
}

если вам не нужны пробелы, вы можете удалить это "если"

см. Контрольные примеры ниже

function IsNumeric (string) {
   if(string === ' '.repeat(string.length)){
      return false
   }
   return string - 0 === string * 1
}


console.log('-1' + ' → ' + IsNumeric('-1'))    
console.log('-1.5' + ' → ' + IsNumeric('-1.5')) 
console.log('0' + ' → ' + IsNumeric('0'))     
console.log('0.42' + ' → ' + IsNumeric('0.42'))   
console.log('.42' + ' → ' + IsNumeric('.42'))    
console.log('99,999' + ' → ' + IsNumeric('99,999'))
console.log('0x89f' + ' → ' + IsNumeric('0x89f'))  
console.log('#abcdef' + ' → ' + IsNumeric('#abcdef'))
console.log('1.2.3' + ' → ' + IsNumeric('1.2.3')) 
console.log('' + ' → ' + IsNumeric(''))    
console.log('33 ' + ' → ' + IsNumeric('33 '))
1 голос
/ 14 апреля 2013

@ CMS 'answer : Ваш фрагмент не был выполнен в случаях пропусков на моем компьютере с использованием nodejs Так что я объединил это с @ ответ Джоэла на следующее:

is_float = function(v) {
    return !isNaN(v) && isFinite(v) &&
        (typeof(v) == 'number' || v.replace(/^\s+|\s+$/g, '').length > 0);
}

Я протестировал это с теми случаями, которые являются поплавками:

var t = [
        0,
        1.2123,
        '0',
        '2123.4',
        -1,
        '-1',
        -123.423,
        '-123.432',
        07,
        0xad,
        '07',
        '0xad'
    ];

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

    var t = [
        'hallo',
        [],
        {},
        'jklsd0',
        '',
        "\t",
        "\n",
        ' '
    ];

Здесь все работает как положено. Может быть, это поможет.

Полный исходный код для этого можно найти здесь .

1 голос
/ 08 января 2017

Я думаю, что мой код идеален ...

/**
 * @param {string} s
 * @return {boolean}
 */
var isNumber = function(s) {
    return s.trim()!=="" && !isNaN(Number(s));
};
1 голос
/ 30 октября 2017

Нет необходимости использовать дополнительную библиотеку.

const IsNumeric = (...numbers) => {
  return numbers.reduce((pre, cur) => pre && !!(cur === 0 || +cur), true);
};

Test

> IsNumeric(1)
true
> IsNumeric(1,2,3)
true
> IsNumeric(1,2,3,0)
true
> IsNumeric(1,2,3,0,'')
false
> IsNumeric(1,2,3,0,'2')
true
> IsNumeric(1,2,3,0,'200')
true
> IsNumeric(1,2,3,0,'-200')
true
> IsNumeric(1,2,3,0,'-200','.32')
true
1 голос
/ 30 марта 2016

isNumeric=(el)=>{return Boolean(parseFloat(el)) && isFinite(el)}

Ничего особенного, но мы можем использовать логический конструктор

1 голос
/ 23 мая 2016

Лучший способ сделать это так:

function isThisActuallyANumber(data){
    return ( typeof data === "number" && !isNaN(data) );
}
1 голос
/ 10 февраля 2016

Если вам нужно проверить специальный набор десятичных знаков y Вы можете использовать этот простой JavaScript:

http://codesheet.org/codesheet/x1kI7hAD

<input type="text" name="date" value="" pattern="[0-9]){1,2}(\.){1}([0-9]){2}" maxlength="6" placeholder="od npr.: 16.06" onchange="date(this);" />

Javascript:

function date(inputField) {        
  var isValid = /^([0-9]){1,2}(\.){1}([0-9]){2}$/.test(inputField.value);   
  if (isValid) {
    inputField.style.backgroundColor = '#bfa';
  } else {
    inputField.style.backgroundColor = '#fba';
  }
  return isValid;
}
1 голос
/ 14 января 2016

Можно использовать библиотеку проверки типа, например https://github.com/arasatasaygin/is.js или просто извлечь оттуда фрагмент проверки (https://github.com/arasatasaygin/is.js/blob/master/is.js#L131):

is.nan = function(value) {    // NaN is number :) 
  return value !== value;
};
 // is a given value number?
is.number = function(value) {
    return !is.nan(value) && Object.prototype.toString.call(value) === '[object Number]';
};

В общем, если вам нужно проверить типы параметров (в точке входа вызова функции), вы можете использовать JSDOC-совместимые контракты (https://www.npmjs.com/package/bycontract):

/**
 * This is JSDOC syntax
 * @param {number|string} sum
 * @param {Object.<string, string>} payload
 * @param {function} cb
 */
function foo( sum, payload, cb ) {
  // Test if the contract is respected at entry point
  byContract( arguments, [ "number|string", "Object.<string, string>", "function" ] );
}
// Test it
foo( 100, { foo: "foo" }, function(){}); // ok
foo( 100, { foo: 100 }, function(){}); // exception
1 голос
/ 14 декабря 2014
function isNumber(n) {
    return (n===n+''||n===n-0) && n*0==0 && /\S/.test(n);
}

Пояснения:

(n===n-0||n===n+'') проверяет, является ли n числом или строкой (отбрасывает массивы, логическое значение, дату, ноль, ...) . Вы можете заменить (n===n-0||n===n+'') на n!==undefined && n!==null && (n.constructor===Number||n.constructor===String): значительно быстрее, но менее лаконично.

n*0==0 проверяет, является ли n конечным числом, как isFinite(n). Если вам нужно проверить строки, которые представляют отрицательное шестнадцатеричное число, просто замените n*0==0 на что-то вроде n.toString().replace(/^\s*-/,'')*0==0.
Конечно, это стоит немного, поэтому, если вам это не нужно, не используйте его.

/\S/.test(n) отбрасывает пустые строки или строки, содержащие только пробелы (необходимо, поскольку isFinite(n) or n*0==0 возвращает false положительное значение в этом случае) . Вы можете уменьшить количество вызовов до .test(n), используя (n!=0||/0/.test(n)) вместо /\S/.test(n), или можете использовать немного более быстрый, но менее лаконичный тест, такой как (n!=0||(n+'').indexOf('0')>=0): незначительное улучшение.

...