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

0 голосов
/ 13 января 2011

Следующее также может работать.

function isNumeric(v) {
         return v.length > 0 && !isNaN(v) && v.search(/[A-Z]|[#]/ig) == -1;
   };
0 голосов
/ 03 февраля 2017
$('.rsval').bind('keypress', function(e){  
        var asciiCodeOfNumbers = [48,46, 49, 50, 51, 52, 53, 54, 54, 55, 56, 57];
        var keynum = (!window.event) ? e.which : e.keyCode; 
        var splitn = this.value.split("."); 
        var decimal = splitn.length;
        var precision = splitn[1]; 
        if(decimal == 2 && precision.length >= 2  ) { console.log(precision , 'e');   e.preventDefault(); } 
        if( keynum == 46 ){  
            if(decimal > 2) { e.preventDefault(); }  
        } 
        if ($.inArray(keynum, asciiCodeOfNumbers) == -1)
            e.preventDefault();    
  });
0 голосов
/ 08 сентября 2011

@ Комментарий Золтена Ленгеля к другим языкам (26 апреля в 2:14) в ответе @CMS Dec (2 '09 в 5:36):

Я бы порекомендовал проверить на typeof (n) === 'string':

    function isNumber(n) {
        if (typeof (n) === 'string') {
            n = n.replace(/,/, ".");
        }
        return !isNaN(parseFloat(n)) && isFinite(n);
    }

Это расширяет рекомендацию Золтана не только для того, чтобы иметь возможность проверять "локализованные числа", такие как isNumber('12,50'), но также и "чистые" числа, такие как isNumber(2011).

0 голосов
/ 19 марта 2012

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

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

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

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

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

0 голосов
/ 19 мая 2016
function isNumeric(n) {
    var isNumber = true;

    $.each(n.replace(/ /g,'').toString(), function(i, v){
        if(v!=',' && v!='.' && v!='-'){
            if(isNaN(v)){
               isNumber = false;
               return false;
            }
         }
     });

    return isNumber;
}

isNumeric(-3,4567.89);   // true <br>

isNumeric(3,4567.89);   // true <br>

isNumeric("-3,4567.89");   // true <br>

isNumeric(3d,4567.89);   // false
0 голосов
/ 29 ноября 2012

Здесь я собрал «хороших» с этой страницы и поместил их в простой тестовый шаблон для самостоятельной оценки.

Для новичков console.log - это встроенная функция (доступная во всех современных браузерах), которая позволяет выводить результаты на консоль JavaScript (копаться, вы ее найдете), а не выводить на страницу HTML. .

var isNumeric = function(val){
    // --------------------------
    // Recommended
    // --------------------------

    // jQuery - works rather well
    // See CMS's unit test also: http://dl.getdropbox.com/u/35146/js/tests/isNumber.html
    return !isNaN(parseFloat(val)) && isFinite(val);

    // Aquatic - good and fast, fails the "0x89f" test, but that test is questionable.
    //return parseFloat(val)==val;

    // --------------------------
    // Other quirky options
    // --------------------------
    // Fails on "", null, newline, tab negative.
    //return !isNaN(val);

    // user532188 - fails on "0x89f"
    //var n2 = val;
    //val = parseFloat(val);
    //return (val!='NaN' && n2==val);

    // Rafael - fails on negative + decimal numbers, may be good for isInt()?
    // return ( val % 1 == 0 ) ? true : false;

    // pottedmeat - good, but fails on stringy numbers, which may be a good thing for some folks?
    //return /^-?(0|[1-9]\d*|(?=\.))(\.\d+)?$/.test(val);

    // Haren - passes all
    // borrowed from http://www.codetoad.com/javascript/isnumeric.asp
    //var RE = /^-{0,1}\d*\.{0,1}\d+$/;
    //return RE.test(val);

    // YUI - good for strict adherance to number type. Doesn't let stringy numbers through.
    //return typeof val === 'number' && isFinite(val);

    // user189277 - fails on "" and "\n"
    //return ( val >=0 || val < 0);
}

var tests = [0, 1, "0", 0x0, 0x000, "0000", "0x89f", 8e5, 0x23, -0, 0.0, "1.0", 1.0, -1.5, 0.42, '075', "01", '-01', "0.", ".0", "a", "a2", true, false, "#000", '1.2.3', '#abcdef', '', "", "\n", "\t", '-', null, undefined];

for (var i=0; i<tests.length; i++){
    console.log( "test " + i + ":    " + tests[i] + "    \t   " + isNumeric(tests[i]) );
}
0 голосов
/ 10 июля 2013

Я нашел простое решение, возможно, не самое лучшее, но оно отлично работает:)

Итак, что я делаю дальше, я анализирую строку в Int и проверяю, совпадает ли размер длины новой переменной, которая теперь является типом int, с длиной исходной строковой переменной. Логически, если размер одинаков, это означает, что строка полностью анализируется в int, и это возможно, только если строка «сделана» только из чисел.

var val=1+$(e).val()+'';
var n=parseInt(val)+'';
if(val.length == n.length )alert('Is int');

Вы можете легко поместить этот код в функцию и вместо предупреждения использовать true, если int. Помните, что если вы используете точку или запятую в строке, вы проверяете, что она по-прежнему ложна, потому что вы анализируете int.

Примечание: добавление 1+ на e.val, чтобы начальный ноль не был удален.

0 голосов
/ 16 сентября 2014

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

v * 1 == v
...