Ich hoffe, dass es etwas gibt, das sich im gleichen konzeptionellen Rahmen bewegt wie das alte VB6 IsNumeric()
Funktion?
Antworten
Zu viele Anzeigen?Hier ist eine High-Performance (2.5*10^7 Iterationen/s @3.8GHz Haswell) Version einer isNumber Implementierung. Es funktioniert für jeden Testfall, den ich finden konnte (einschließlich Symbols):
var isNumber = (function () {
var isIntegerTest = /^\d+$/;
var isDigitArray = [!0, !0, !0, !0, !0, !0, !0, !0, !0, !0];
function hasLeading0s (s) {
return !(typeof s !== 'string' ||
s.length < 2 ||
s[0] !== '0' ||
!isDigitArray[s[1]] ||
isIntegerTest.test(s));
}
var isWhiteSpaceTest = /\s/;
return function isNumber (s) {
var t = typeof s;
var n;
if (t === 'number') {
return (s <= 0) || (s > 0);
} else if (t === 'string') {
n = +s;
return !((!(n <= 0) && !(n > 0)) || n === '0' || hasLeading0s(s) || !(n !== 0 || !(s === '' || isWhiteSpaceTest.test(s))));
} else if (t === 'object') {
return !(!(s instanceof Number) || ((n = +s), !(n <= 0) && !(n > 0)));
}
return false;
};
})();
Sie können Typen verwenden, wie bei der Durchflussbibliothek y, um eine statische Überprüfung zur Kompilierzeit zu erhalten. Natürlich nicht furchtbar nützlich für Benutzereingaben.
// @flow
function acceptsNumber(value: number) {
// ...
}
acceptsNumber(42); // Works!
acceptsNumber(3.14); // Works!
acceptsNumber(NaN); // Works!
acceptsNumber(Infinity); // Works!
acceptsNumber("foo"); // Error!
Meine Lösung:
// returns true for positive ints;
// no scientific notation, hexadecimals or floating point dots
var isPositiveInt = function(str) {
var result = true, chr;
for (var i = 0, n = str.length; i < n; i++) {
chr = str.charAt(i);
if ((chr < "0" || chr > "9") && chr != ",") { //not digit or thousands separator
result = false;
break;
};
if (i == 0 && (chr == "0" || chr == ",")) { //should not start with 0 or ,
result = false;
break;
};
};
return result;
};
Sie können zusätzliche Bedingungen innerhalb der Schleife hinzufügen, um Ihren besonderen Bedürfnissen gerecht zu werden.
Test, ob eine Zeichenkette oder eine Zahl eine Zahl ist
const isNumeric = stringOrNumber =>
stringOrNumber == 0 || !!+stringOrNumber;
Oder wenn Sie eine Zeichenkette oder eine Zahl in eine Zahl umwandeln wollen
const toNumber = stringOrNumber =>
stringOrNumber == 0 || +stringOrNumber ? +stringOrNumber : NaN;
In meiner Anwendung sind nur die Zeichen a-z A-Z und 0-9 erlaubt. Ich habe die obige Antwort gefunden, indem ich " String % 1 === 0" funktionierte, es sei denn, die Zeichenkette begann mit 0xnn (z. B. 0x10), und dann würde sie als numerisch zurückgegeben, obwohl wir das nicht wollten. Die folgende einfache Falle in meiner numerischen Prüfung scheint den Trick in unseren speziellen Fällen zu tun.
function isStringNumeric(str_input){
//concat a temporary 1 during the modulus to keep a beginning hex switch combination from messing us up
//very simple and as long as special characters (non a-z A-Z 0-9) are trapped it is fine
return '1'.concat(str_input) % 1 === 0;}
Warnung : Damit wird möglicherweise ein seit langem bestehender Fehler in Javascript und Actionscript ausgenutzt [Number("1" + the_string) % 1 === 0)], dafür kann ich nicht sprechen, aber es ist genau das, was wir brauchten.