Wat is de schoonste, meest effectieve manier om decimale getallen te valideren in JavaScript?
Bonuspunten voor:
Duidelijkheid. De oplossing moet duidelijk en eenvoudig zijn.
Cross-platform.
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
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));
}
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: