Επικύρωση δεκαδικών αριθμών σε JavaScript - IsNumeric()

Ποιος είναι ο καθαρότερος, πιο αποτελεσματικός τρόπος για την επικύρωση δεκαδικών αριθμών στη JavaScript;

Μπόνους για:

  1. Σαφήνεια. Η λύση πρέπει να είναι καθαρή και απλή.
  2. Cross-platform.

Περιπτώσεις δοκιμών:

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

Αυτός ο τρόπος φαίνεται να λειτουργεί καλά:

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

Και για να το δοκιμάσετε:

// 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;
}

Δανείστηκα αυτό το regex από το http://www.codetoad.com/javascript/isnumeric.asp. Επεξήγηση:

/^ 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
Σχόλια (3)

Θα ήθελα να προσθέσω τα εξής: true 2. IsNumeric('075') => true

Σχόλια (1)

Μερικές δοκιμές για να προσθέσετε:

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

Βρήκα αυτό:

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

Η λύση καλύπτει:

  • Ένα προαιρετικό αρνητικό πρόσημο στην αρχή
  • Ένα απλό μηδέν, ή ένα ή περισσότερα ψηφία που δεν αρχίζουν με 0, ή τίποτα εφόσον ακολουθεί τελεία
  • Μια τελεία που ακολουθείται από 1 ή περισσότερους αριθμούς
Σχόλια (0)