Decimale getallen valideren in JavaScript - IsNumeric()

Wat is de schoonste, meest effectieve manier om decimale getallen te valideren in JavaScript?

Bonuspunten voor:

  1. Duidelijkheid. De oplossing moet duidelijk en eenvoudig zijn.

  2. Cross-platform.

  3. Test gevallen:

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

Deze manier lijkt goed te werken:

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

En om het te testen:

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

Ik heb die regex geleend van http://www.codetoad.com/javascript/isnumeric.asp. Uitleg:

/^ 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
Commentaren (3)

Ik zou graag het volgende willen toevoegen:

1. IsNumeric('0x89f') => true
2. IsNumeric('075') => true

Positieve hex getallen beginnen met 0x en negatieve hex getallen beginnen met -0x. Positieve oct getallen beginnen met 0 en negatieve oct getallen beginnen met -0. Deze neemt het meeste van wat al genoemd is in beschouwing, maar bevat hex en octale getallen, negatief wetenschappelijk, Infinity en heeft decimaal wetenschappelijk verwijderd (4e3.2 is niet geldig).

function IsNumeric(input){
  var RE = /^-?(0|INF|(0[1-7][0-7]*)|(0x[0-9a-fA-F]+)|((0|[1-9][0-9]*|(?=[\.,]))([\.,][0-9]+)?([eE]-?\d+)?))$/;
  return (RE.test(input));
}
Commentaren (1)

Een paar testen om toe te voegen:

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

Ik heb dit gevonden:

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

De oplossing dekt:

  • Een optioneel negatief teken aan het begin
  • Een enkele nul, of een of meer cijfers die niet met een 0 beginnen, of niets zolang er een punt volgt
  • Een punt gevolgd door 1 of meer cijfers
Commentaren (0)