Pytanie Walidacja liczb dziesiętnych w JavaScript - IsNumeric ()


Jaki jest najczystszy i najskuteczniejszy sposób sprawdzania liczb dziesiętnych w JavaScript?

Punkty bonusowe za:

  1. Przejrzystość. Rozwiązanie powinno być czyste i proste.
  2. Wieloplatformowy.

Przypadki testowe:

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

2156


pochodzenie


Tylko notatka 99 999 jest prawidłową liczbą we Francji, jest taka sama jak 99,999 w formacie uk / us, więc jeśli czytasz w ciągu od wymówienia formularza wejściowego, wówczas 99,999 może być prawdą. - Re0sless
Sprawdź również ten post i świetne komentarze. - powtac
Przecinek dziesiętny jest standardem w całej Europie i Rosji (z wyjątkiem Wielkiej Brytanii) - Calmarius
jQuery 1.7 wprowadził jQuery.isNumeric funkcja użyteczności: api.jquery.com/jQuery.isNumeric - Ates Goral
jQuery.isNumeric zakończy się siódmym testem PO (IsNumeric('0x89f') => *false*). Nie jestem jednak pewien, czy zgadzam się z tym przypadkiem testowym. - Tim Lehner


Odpowiedzi:


@ Joel's odpowiedź jest dość blisko, ale zawiedzie w następujących przypadkach:

// Whitespace strings:
IsNumeric(' ')    == true;
IsNumeric('\t\t') == true;
IsNumeric('\n\r') == true;

// Number literals:
IsNumeric(-1)  == false;
IsNumeric(0)   == false;
IsNumeric(1.1) == false;
IsNumeric(8e5) == false;

Jakiś czas temu musiałem wdrożyć IsNumeric funkcja, aby sprawdzić, czy zmienna zawiera wartość liczbową, niezależnie od jego rodzajumoże to być String zawierające wartość numeryczną (musiałem uwzględnić także notację wykładniczą, itp.), Number obiekt, praktycznie wszystko można przekazać do tej funkcji, nie mogłem dokonać żadnych założeń typu, dbając o przymus typu (np. +true == 1; ale true nie należy uważać za "numeric").

Myślę, że warto dzielić ten zestaw +30 testów jednostkowych wykonane w wielu implementacjach funkcji, a także udostępniać ten, który przechodzi wszystkie moje testy:

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

P.S.  isNaN & isFinite mieć mylące zachowanie z powodu wymuszonej konwersji na liczbę. W ES6 Number.isNaN & Number.isFinite naprawi te problemy. Miej to na uwadze podczas korzystania z nich.


Aktualizacja : Oto, jak robi to teraz jQuery (2.2 stabilny):

isNumeric: function(obj) {
    var realStringObj = obj && obj.toString();
    return !jQuery.isArray(obj) && (realStringObj - parseFloat(realStringObj) + 1) >= 0;
}

Aktualizacja : Kątowy 4.3:

export function isNumeric(value: any): boolean {
    return !isNaN(value - parseFloat(value));
}

2760



Ta odpowiedź jest poprawna. stackoverflow.com/questions/18082/... Odpowiedź Joela jest zła. Jak błędna odpowiedź mogła zgromadzić więcej głosów niż ta właściwa? - Arvin
to nie działa z innymi ustawieniami, w których używamy przecinka dziesiętnego, ale dodaj `n = n.replace (/, /,". "); ' przed powrotem, aby to naprawić. - Zoltan Lengyel
@RobG, to zachowanie jest zamierzone, 2e308 > Number.MAX_VALUE od 2e308 == Infinity. Jeśli chcesz funkcję, która zwraca true również dla wartości dodatniej i ujemnej nieskończoności, sprawdź funkcję Nr 2 w zestaw testów. Twoje zdrowie. - CMS
Nawiasem mówiąc, testy jednostkowe są obecnie używane przez Projekt jQuery - CMS
jQuery są teraz również za pomocą ta implementacja. - RichardTowers


Arrrgh! Nie słuchaj odpowiedzi wyrażenia regularnego. RegEx jest na to chytry i nie mówię tylko o wydajności. Tak łatwo jest dokonać subtelnego, niemożliwego do zauważenia błędu z twoją regularną ekspresją.

Jeśli nie możesz użyć isNaN()powinno to działać znacznie lepiej:

function IsNumeric(input)
{
    return (input - 0) == input && (''+input).trim().length > 0;
}

Oto jak to działa:

The (input - 0) wyrażenie siły JavaScript do wykonania przymusu na wartość wejściową; najpierw musi zostać zinterpretowana jako liczba dla operacji odejmowania. Jeśli ta konwersja na numer nie powiedzie się, pojawi się wyrażenie NaN. To numeryczne Wynik jest następnie porównywany z oryginalną wartością, którą przekazałeś. Ponieważ lewa strona jest teraz numeryczna, ponownie stosuje się metodę przymusu. Teraz, gdy dane wejściowe z obu stron zostały wymuszone na ten sam typ z tej samej oryginalnej wartości, można by pomyśleć, że powinny być zawsze takie same (zawsze prawdziwe). Istnieje jednak specjalna reguła, która mówi NaN nigdy nie jest równe NaN, a więc wartość, której nie można przekonwertować na liczbę (i tylko wartości, które nie mogą być konwertowane na liczby), spowoduje fałsz.

Kontrola długości dotyczy specjalnego przypadku obejmującego puste struny. Zauważ też, że spada na twój test 0x89f, ale to dlatego, że w wielu środowiskach jest to dobry sposób na zdefiniowanie liczby literalnej. Jeśli chcesz uchwycić ten konkretny scenariusz, możesz dodać dodatkową kontrolę. Nawet lepiej, jeśli to jest twój powód, dla którego nie używasz isNaN() po prostu zapakuj swoją własną funkcję isNaN() to może również wykonać dodatkową kontrolę.

W podsumowaniu, jeśli chcesz wiedzieć, czy wartość można przekonwertować na liczbę, spróbuj ją przekonwertować na liczbę.


Wróciłem i zrobiłem kilka badań czemu ciąg białych znaków nie miał oczekiwanego wyniku, i myślę, że otrzymuję go teraz: wymuszany jest pusty ciąg znaków 0 zamiast NaN. Po prostu przycinanie sznurka przed sprawdzeniem długości zajmie się tym przypadkiem.

Uruchamia test jednostki w stosunku do nowego kodu i zawodzi tylko w nieskończoności i literałach boolowskich, a jedynym problemem, który powinien być problemem, jest generowanie kodu (naprawdę, kto mógłby wpisać literał i sprawdzić czy jest on numeryczny? Powinieneś wiedzieć), a to byłby jakiś dziwny kod do wygenerowania.

Ale znowu, jedynym powodem, aby go użyć jest to, że z jakiegoś powodu musisz unikać isNa ().


315



jeszcze lepiej, jeśli musisz tylko wziąć pod uwagę, że specjalny przypadek 0x89f jest zawijany przez funkcję IsNumeric () wokół isNaN (), która następnie dokonuje specjalnego sprawdzenia tylko wtedy, gdy isNaN () zwraca fałsz. - Joel Coehoorn
To się nie powiedzie w przypadku ciągów białych znaków, np IsNumeric(' '), IsNumeric('\n\t'), itd. wszystkie powracają true - Crescent Fresh
To również zawiedzie Number literały IsNumeric(5) == false; sprawdź zestaw testów jednostkowych, które napisałem, ta funkcja to liczba 16 w pakiecie testowym. stackoverflow.com/questions/18082/... - CMS
Nie mogę uwierzyć, że nikt nie zwrócił uwagi na użycie wyrażenia regularnego (zamień) po ostrzeżeniu o tym, że nie używa się wyrażeń regularnych ... Oczywiście, zastąpienie spacji jest prostsze niż analiza liczby, ale nadal jest zdecydowanie "niepoważne". - Patrick M
@Oriol To duży problem ... bez żadnych poprawek bezpieczeństwa wydanych po tej dacie, unikanie XP powinno być priorytetem. - Joel Coehoorn


Ten sposób wydaje się działać dobrze:

function IsNumeric(input){
    var RE = /^-{0,1}\d*\.{0,1}\d+$/;
    return (RE.test(input));
}

I żeby to przetestować:

// alert(TestIsNumeric());

function TestIsNumeric(){
    var results = ''
    results += (IsNumeric('-1')?"Pass":"Fail") + ": IsNumeric('-1') => true\n";
    results += (IsNumeric('-1.5')?"Pass":"Fail") + ": IsNumeric('-1.5') => true\n";
    results += (IsNumeric('0')?"Pass":"Fail") + ": IsNumeric('0') => true\n";
    results += (IsNumeric('0.42')?"Pass":"Fail") + ": IsNumeric('0.42') => true\n";
    results += (IsNumeric('.42')?"Pass":"Fail") + ": IsNumeric('.42') => true\n";
    results += (!IsNumeric('99,999')?"Pass":"Fail") + ": IsNumeric('99,999') => false\n";
    results += (!IsNumeric('0x89f')?"Pass":"Fail") + ": IsNumeric('0x89f') => false\n";
    results += (!IsNumeric('#abcdef')?"Pass":"Fail") + ": IsNumeric('#abcdef') => false\n";
    results += (!IsNumeric('1.2.3')?"Pass":"Fail") + ": IsNumeric('1.2.3') => false\n";
    results += (!IsNumeric('')?"Pass":"Fail") + ": IsNumeric('') => false\n";
    results += (!IsNumeric('blah')?"Pass":"Fail") + ": IsNumeric('blah') => false\n";

    return results;
}

Pożyczyłem to od regex http://www.codetoad.com/javascript/isnumeric.asp. Wyjaśnienie:

/^ match beginning of string
-{0,1} optional negative sign
\d* optional digits
\.{0,1} optional decimal point
\d+ at least one digit
$/ match end of string

58



// TAKŻE NALEŻY DODAĆ DO TWOJEGO TESTU wyniki + = (! IsNumeric ('-')? "Pass": "Fail") + ": IsNumeric ('-') => false \ n"; results + = (! IsNumeric ('01 ')? "Pass": "Fail") + ": IsNumeric ('01') => false \ n"; results + = (! IsNumeric ('- 01')? "Pass": "Fail") + ": IsNumeric ('- 01') => false \ n"; results + = (! IsNumeric ('000')? "Pass": "Fail") + ": IsNumeric ('000') => false \ n"; - Dan
co to oznacza? / ^ - {0,1} \ d * \. {0,1} \ d + $ / - call-me
czy "{0,1}" można zastąpić "?", więc twoje wyrażenie regularne będzie wyglądać tak: /^-?\d*\.?\d+$/? - Cloud


Wieśniak! Interfejs użytkownika używa tego:

isNumber: function(o) {
    return typeof o === 'number' && isFinite(o);
}

45



To bardziej sprawdza typ zmiennej, w przeciwieństwie do zawartości numeru. Będzie również zawieść na liczbach utworzonych przy pomocy new Number(1). - alex
Jak mówi alex, nie odpowiada to na postawione pytanie, ponieważ nie powiedzie się, jeśli o = "1001". - Case


function IsNumeric(num) {
     return (num >=0 || num < 0);
}

Działa to również dla numerów typu 0x23.


44



IsNumeric(''), IsNumeric(' '), IsNumeric(true), IsNumeric(false), IsNumeric(null) powrót true zamiast false. - Oriol
Poprawiłem to: stackoverflow.com/a/20712631/1985601 - daniel1426


Przyjęta odpowiedź nie spełniła twojego testu nr 7 i domyślam się, że to dlatego, że zmieniłeś zdanie. Jest to więc odpowiedź na zaakceptowaną odpowiedź, z którą miałem problemy.

Podczas niektórych projektów musiałem zweryfikować niektóre dane i być tak pewnym, jak to możliwe, że jest to wartość liczbowa javascript, którą można wykorzystać w operacjach matematycznych.

jQuery, a niektóre inne biblioteki javascript zawierają już taką funkcję, zwykle nazywaną isNumeric. Istnieje również opublikuj na stackoverflow która została powszechnie przyjęta jako odpowiedź, ta sama ogólna rutyna, której używają wyżej wymienione biblioteki.

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

Po pierwsze, powyższy kod zwróciłby wartość true, gdyby argument był tablicą o długości 1, a ten pojedynczy element był typu uznanego za numeryczny według powyższej logiki. Moim zdaniem, jeśli jest to tablica, to nie numeryczna.

Aby złagodzić ten problem, dodałem czek do obniżenia tablic z logiki

function isNumber(n) {
  return Object.prototype.toString.call(n) !== '[object Array]' &&!isNaN(parseFloat(n)) && isFinite(n);
}

Oczywiście możesz również użyć Array.isArray, jquery $.isArray lub prototyp Object.isArray zamiast Object.prototype.toString.call(n) !== '[object Array]'

Moim drugim problemem było to, że ujemne szesnastkowe liczby całkowite ("-0xA" -> -10) nie były liczone jako numeryczne. Jednak szesnastkowe liczby całkowite dodatnie szesnastkowe ("0xA" -> 10) były traktowane jako liczby. Potrzebowałem obu, aby być prawidłową wartością numeryczną.

Następnie zmodyfikowałem logikę, aby wziąć to pod uwagę.

function isNumber(n) {
  return Object.prototype.toString.call(n) !== '[object Array]' &&!isNaN(parseFloat(n)) && isFinite(n.toString().replace(/^-/, ''));
}

Jeśli martwisz się tworzeniem wyrażeń regularnych za każdym razem, gdy funkcja zostanie wywołana, możesz przepisać ją w ramach zamknięcia, coś takiego

var isNumber = (function () {
  var rx = /^-/;

  return function (n) {
      return Object.prototype.toString.call(n) !== '[object Array]' &&!isNaN(parseFloat(n)) && isFinite(n.toString().replace(rx, ''));
  };
}());

Następnie wziąłem CMS-y +30 przypadków testowych i sklonował testowanie na jsfiddle dodano moje dodatkowe przypadki testowe i moje opisane powyżej rozwiązanie.

Nie może zastąpić powszechnie akceptowanej / używanej odpowiedzi, ale jeśli jest to bardziej oczekiwane, niż wynika to z funkcji isNumeric, to mam nadzieję, że będzie to pomocne.

EDYTOWAĆ: Jak wskazano przez Bergiistnieją inne możliwe obiekty, które można uznać za liczbowe i lepiej byłoby dodać do białej listy niż czarną listę. Mając to na uwadze, dodałbym kryteria.

Chcę, aby moja funkcja numeryczna uwzględniała tylko liczby lub łańcuchy

Mając to na uwadze, lepiej byłoby użyć

function isNumber(n) {
  return (Object.prototype.toString.call(n) === '[object Number]' || Object.prototype.toString.call(n) === '[object String]') &&!isNaN(parseFloat(n)) && isFinite(n.toString().replace(/^-/, ''));
}

Przetestuj rozwiązania

var testHelper = function() {

  var testSuite = function() {
    test("Integer Literals", function() {
      ok(isNumber("-10"), "Negative integer string");
      ok(isNumber("0"), "Zero string");
      ok(isNumber("5"), "Positive integer string");
      ok(isNumber(-16), "Negative integer number");
      ok(isNumber(0), "Zero integer number");
      ok(isNumber(32), "Positive integer number");
      ok(isNumber("040"), "Octal integer literal string");
      ok(isNumber(0144), "Octal integer literal");
      ok(isNumber("-040"), "Negative Octal integer literal string");
      ok(isNumber(-0144), "Negative Octal integer literal");
      ok(isNumber("0xFF"), "Hexadecimal integer literal string");
      ok(isNumber(0xFFF), "Hexadecimal integer literal");
      ok(isNumber("-0xFF"), "Negative Hexadecimal integer literal string");
      ok(isNumber(-0xFFF), "Negative Hexadecimal integer literal");
    });

    test("Foating-Point Literals", function() {
      ok(isNumber("-1.6"), "Negative floating point string");
      ok(isNumber("4.536"), "Positive floating point string");
      ok(isNumber(-2.6), "Negative floating point number");
      ok(isNumber(3.1415), "Positive floating point number");
      ok(isNumber(8e5), "Exponential notation");
      ok(isNumber("123e-2"), "Exponential notation string");
    });

    test("Non-Numeric values", function() {
      equals(isNumber(""), false, "Empty string");
      equals(isNumber("        "), false, "Whitespace characters string");
      equals(isNumber("\t\t"), false, "Tab characters string");
      equals(isNumber("abcdefghijklm1234567890"), false, "Alphanumeric character string");
      equals(isNumber("xabcdefx"), false, "Non-numeric character string");
      equals(isNumber(true), false, "Boolean true literal");
      equals(isNumber(false), false, "Boolean false literal");
      equals(isNumber("bcfed5.2"), false, "Number with preceding non-numeric characters");
      equals(isNumber("7.2acdgs"), false, "Number with trailling non-numeric characters");
      equals(isNumber(undefined), false, "Undefined value");
      equals(isNumber(null), false, "Null value");
      equals(isNumber(NaN), false, "NaN value");
      equals(isNumber(Infinity), false, "Infinity primitive");
      equals(isNumber(Number.POSITIVE_INFINITY), false, "Positive Infinity");
      equals(isNumber(Number.NEGATIVE_INFINITY), false, "Negative Infinity");
      equals(isNumber(new Date(2009, 1, 1)), false, "Date object");
      equals(isNumber(new Object()), false, "Empty object");
      equals(isNumber(function() {}), false, "Instance of a function");
      equals(isNumber([]), false, "Empty Array");
      equals(isNumber(["-10"]), false, "Array Negative integer string");
      equals(isNumber(["0"]), false, "Array Zero string");
      equals(isNumber(["5"]), false, "Array Positive integer string");
      equals(isNumber([-16]), false, "Array Negative integer number");
      equals(isNumber([0]), false, "Array Zero integer number");
      equals(isNumber([32]), false, "Array Positive integer number");
      equals(isNumber(["040"]), false, "Array Octal integer literal string");
      equals(isNumber([0144]), false, "Array Octal integer literal");
      equals(isNumber(["-040"]), false, "Array Negative Octal integer literal string");
      equals(isNumber([-0144]), false, "Array Negative Octal integer literal");
      equals(isNumber(["0xFF"]), false, "Array Hexadecimal integer literal string");
      equals(isNumber([0xFFF]), false, "Array Hexadecimal integer literal");
      equals(isNumber(["-0xFF"]), false, "Array Negative Hexadecimal integer literal string");
      equals(isNumber([-0xFFF]), false, "Array Negative Hexadecimal integer literal");
      equals(isNumber([1, 2]), false, "Array with more than 1 Positive interger number");
      equals(isNumber([-1, -2]), false, "Array with more than 1 Negative interger number");
    });
  }

  var functionsToTest = [

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

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

    function(n) {
      return !isNaN((n));
    },

    function(n) {
      return !isNaN(parseFloat(n));
    },

    function(n) {
      return typeof(n) != "boolean" && !isNaN(n);
    },

    function(n) {
      return parseFloat(n) === Number(n);
    },

    function(n) {
      return parseInt(n) === Number(n);
    },

    function(n) {
      return !isNaN(Number(String(n)));
    },

    function(n) {
      return !isNaN(+('' + n));
    },

    function(n) {
      return (+n) == n;
    },

    function(n) {
      return n && /^-?\d+(\.\d+)?$/.test(n + '');
    },

    function(n) {
      return isFinite(Number(String(n)));
    },

    function(n) {
      return isFinite(String(n));
    },

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

    function(n) {
      return parseFloat(n) == n;
    },

    function(n) {
      return (n - 0) == n && n.length > 0;
    },

    function(n) {
      return typeof n === 'number' && isFinite(n);
    },

    function(n) {
      return !Array.isArray(n) && !isNaN(parseFloat(n)) && isFinite(n.toString().replace(/^-/, ''));
    }

  ];


  // Examines the functionsToTest array, extracts the return statement of each function
  // and fills the toTest select element.
  var fillToTestSelect = function() {
    for (var i = 0; i < functionsToTest.length; i++) {
      var f = functionsToTest[i].toString();
      var option = /[\s\S]*return ([\s\S]*);/.exec(f)[1];
      $("#toTest").append('<option value="' + i + '">' + (i + 1) + '. ' + option + '</option>');
    }
  }

  var performTest = function(functionNumber) {
    reset(); // Reset previous test
    $("#tests").html(""); //Clean test results
    isNumber = functionsToTest[functionNumber]; // Override the isNumber global function with the one to test
    testSuite(); // Run the test

    // Get test results
    var totalFail = 0;
    var totalPass = 0;
    $("b.fail").each(function() {
      totalFail += Number($(this).html());
    });
    $("b.pass").each(function() {
      totalPass += Number($(this).html());
    });
    $("#testresult").html(totalFail + " of " + (totalFail + totalPass) + " test failed.");

    $("#banner").attr("class", "").addClass(totalFail > 0 ? "fail" : "pass");
  }

  return {
    performTest: performTest,
    fillToTestSelect: fillToTestSelect,
    testSuite: testSuite
  };
}();


$(document).ready(function() {
  testHelper.fillToTestSelect();
  testHelper.performTest(0);

  $("#toTest").change(function() {
    testHelper.performTest($(this).children(":selected").val());
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js" type="text/javascript"></script>
<script src="https://rawgit.com/Xotic750/testrunner-old/master/testrunner.js" type="text/javascript"></script>
<link href="https://rawgit.com/Xotic750/testrunner-old/master/testrunner.css" rel="stylesheet" type="text/css">
<h1>isNumber Test Cases</h1>

<h2 id="banner" class="pass"></h2>

<h2 id="userAgent">Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11</h2>

<div id="currentFunction"></div>

<div id="selectFunction">
  <label for="toTest" style="font-weight:bold; font-size:Large;">Select function to test:</label>
  <select id="toTest" name="toTest">
  </select>
</div>

<div id="testCode"></div>

<ol id="tests">
  <li class="pass">
    <strong>Integer Literals <b style="color:black;">(0, 10, 10)</b></strong>

    <ol style="display: none;">
      <li class="pass">Negative integer string</li>

      <li class="pass">Zero string</li>

      <li class="pass">Positive integer string</li>

      <li class="pass">Negative integer number</li>

      <li class="pass">Zero integer number</li>

      <li class="pass">Positive integer number</li>

      <li class="pass">Octal integer literal string</li>

      <li class="pass">Octal integer literal</li>

      <li class="pass">Hexadecimal integer literal string</li>

      <li class="pass">Hexadecimal integer literal</li>
    </ol>
  </li>

  <li class="pass">
    <strong>Foating-Point Literals <b style="color:black;">(0, 6, 6)</b></strong>

    <ol style="display: none;">
      <li class="pass">Negative floating point string</li>

      <li class="pass">Positive floating point string</li>

      <li class="pass">Negative floating point number</li>

      <li class="pass">Positive floating point number</li>

      <li class="pass">Exponential notation</li>

      <li class="pass">Exponential notation string</li>
    </ol>
  </li>

  <li class="pass">
    <strong>Non-Numeric values <b style="color:black;">(0, 18, 18)</b></strong>

    <ol style="display: none;">
      <li class="pass">Empty string: false</li>

      <li class="pass">Whitespace characters string: false</li>

      <li class="pass">Tab characters string: false</li>

      <li class="pass">Alphanumeric character string: false</li>

      <li class="pass">Non-numeric character string: false</li>

      <li class="pass">Boolean true literal: false</li>

      <li class="pass">Boolean false literal: false</li>

      <li class="pass">Number with preceding non-numeric characters: false</li>

      <li class="pass">Number with trailling non-numeric characters: false</li>

      <li class="pass">Undefined value: false</li>

      <li class="pass">Null value: false</li>

      <li class="pass">NaN value: false</li>

      <li class="pass">Infinity primitive: false</li>

      <li class="pass">Positive Infinity: false</li>

      <li class="pass">Negative Infinity: false</li>

      <li class="pass">Date object: false</li>

      <li class="pass">Empty object: false</li>

      <li class="pass">Instance of a function: false</li>
    </ol>
  </li>
</ol>

<div id="main">
  This page contains tests for a set of isNumber functions. To see them, take a look at the source.
</div>

<div>
  <p class="result">Tests completed in 0 milliseconds.
    <br>0 tests of 0 failed.</p>
</div>


37



Jest to moim zdaniem najbardziej ekranowana funkcja; ostatni. Przyjęta odpowiedź obejmuje prawdopodobnie 99,99% wszystkich przypadków, ale ta prawdopodobnie ma 100% a) przypadków z niewielkim obciążeniem. - Samuel
Zapomniałeś o "99,999" dosłownie Foating-Point. Jest to numer ważny we wszystkich krajach Europy poza Wielką Brytanią - Andrii Horda
Nie zapomniano, że nie było to coś, co uważałem za numeryczne w sensie numerów Javascript - stwierdził również PO IsNumeric('99,999') => false - Xotic750


Tak, wbudowany isNaN(object) będzie dużo szybszy niż jakiekolwiek parsowanie regex, ponieważ jest wbudowane i skompilowane, zamiast interpretowane w locie.

Chociaż wyniki różnią się nieco od tego, czego szukasz (Spróbuj):

                                              // IS NUMERIC
document.write(!isNaN('-1') + "<br />");      // true
document.write(!isNaN('-1.5') + "<br />");    // true
document.write(!isNaN('0') + "<br />");       // true
document.write(!isNaN('0.42') + "<br />");    // true
document.write(!isNaN('.42') + "<br />");     // true
document.write(!isNaN('99,999') + "<br />");  // false
document.write(!isNaN('0x89f') + "<br />");   // true
document.write(!isNaN('#abcdef') + "<br />"); // false
document.write(!isNaN('1.2.3') + "<br />");   // false
document.write(!isNaN('') + "<br />");        // true
document.write(!isNaN('blah') + "<br />");    // false

30





Od jQuery 1.7 można używać jQuery.isNumeric():

$.isNumeric('-1');      // true
$.isNumeric('-1.5');    // true
$.isNumeric('0');       // true
$.isNumeric('0.42');    // true
$.isNumeric('.42');     // true
$.isNumeric('0x89f');   // true (valid hexa number)
$.isNumeric('99,999');  // false
$.isNumeric('#abcdef'); // false
$.isNumeric('1.2.3');   // false
$.isNumeric('');        // false
$.isNumeric('blah');    // false

Po prostu zauważ, że w przeciwieństwie do tego, co powiedziałeś, 0x89f jest prawidłową liczbą (hexa)


14



Program operacyjny chce być ważny dziesiętny numer, więc jQuery isNumeric nie pasuje. Zawodzi również w przypadku bardzo dużych liczb. - RobG


Użyj tej funkcji isNaN. Wierzę, że jeśli przetestujesz !isNaN(yourstringhere) działa dobrze w każdej z tych sytuacji.


14



Uwaga:! IsNaN (null) == prawda od Number (null) == 0 - Jonathan Lonowski
if (! (x == null || isNaN (x))) alert ("isNumeric"); // Ale to rozwiązanie akceptuje 0x40, więc nadal nie jest tym, czego chciał. - some
Zauważ, że isNaN ("Nieskończoność") === fałsz, co prawdopodobnie nie jest tym, czego potrzebujesz (ale też nie będzie się działo w rzeczywistości). - Erik Hesselink


Można to zrobić bez RegExp as

function IsNumeric(data){
    return parseFloat(data)==data;
}

10



shouldnt it === - powtac
Jeśli używamy ==, to zwróci true nawet dla liczb przedstawionych jako ciągi. Tak więc "42" będzie liczone jako poprawna liczba w przypadku "==" i będzie liczone jako nieważne w przypadku === - Aquatic
to zwraca wartość true w "-0.", "-.0", ".0" i "0" - Janus Troelsen


Zdaję sobie sprawę, że oryginalne pytanie nie wspomniało o jQuery, ale jeśli używasz jQuery, możesz zrobić:

$.isNumeric(val)

Prosty.

https://api.jquery.com/jQuery.isNumeric/ (od wersji jQuery 1.7)


5