Ποιος είναι ο καθαρότερος, πιο αποτελεσματικός τρόπος για την επικύρωση δεκαδικών αριθμών στη JavaScript;
Μπόνους για:
Περιπτώσεις δοκιμών:
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
Θα ήθελα να προσθέσω τα εξής:
<pre>,
1. IsNumeric('0x89f') => true
2. IsNumeric('075') => true</code>,
</pre>,
Οι θετικοί δεκαεξαδικοί αριθμοί αρχίζουν με 0x
και οι αρνητικοί δεκαεξαδικοί αριθμοί αρχίζουν με -0x
.
Οι θετικοί αριθμοί oct ξεκινούν με 0
και οι αρνητικοί αριθμοί oct ξεκινούν με -0
.
Αυτό εδώ λαμβάνει υπόψη του τα περισσότερα από όσα έχουν ήδη αναφερθεί, αλλά περιλαμβάνει δεκαεξαδικούς και οκταδικούς αριθμούς, αρνητικούς επιστημονικούς, Infinity και έχει αφαιρέσει τους δεκαδικούς επιστημονικούς (το 4e3.2
δεν ισχύει).
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));
}
Μερικές δοκιμές για να προσθέσετε:
IsNumeric('01.05') => false
IsNumeric('1.') => false
IsNumeric('.') => false
Βρήκα αυτό:
function IsNumeric(input) {
return /^-?(0|[1-9]\d*|(?=\.))(\.\d+)?$/.test(input);
}
Η λύση καλύπτει: