Mi a legtisztább, leghatékonyabb módja a tizedes számok érvényesítésének JavaScriptben?
Bónuszpontok a következőkért:
Tesztek:
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
Úgy tűnik, ez a módszer jól működik:
function IsNumeric(input){
var RE = /^-{0,1}\d*\.{0,1}\d+$/;
return (RE.test(input));
}
És hogy teszteljük:
// 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;
}
Ezt a regexet a http://www.codetoad.com/javascript/isnumeric.asp oldalról kölcsönöztem. Magyarázat:
/^ 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
Szeretném hozzátenni a következőket:
1. IsNumeric('0x89f') => true 2. IsNumeric('075') => true
A pozitív hexaszámok 0x
-vel kezdődnek, a negatív hexaszámok pedig -0x
-vel.
A pozitív oct számok 0
-val kezdődnek, a negatív oct számok pedig -0
-val.
Ez a legtöbbet figyelembe veszi a már említettekből, de tartalmazza a hexa és oktális számokat, a negatív tudományos számokat, a végtelen számot, és eltávolította a decimális tudományos számokat (a 4e3.2
nem érvényes).
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));
}
Néhány tesztet kell hozzátennem:
IsNumeric('01.05') => false
IsNumeric('1.') => false
IsNumeric('.') => false
Ezt találtam ki:
function IsNumeric(input) {
return /^-?(0|[1-9]\d*|(?=\.))(\.\d+)?$/.test(input);
}
A megoldás fedezi: