Zwei Antworten für Sie:
Basierend auf dem Parsen
Regulären Ausdruck
Beachten Sie, dass ich in beiden Fällen "positive Ganzzahl" als eingeschlossen interpretiert habe 0, obwohl dies 0nicht positiv ist. Ich füge Notizen hinzu, wenn Sie nicht zulassen möchten 0.
Basierend auf Parsing
Wenn Sie möchten, dass es sich um eine normalisierte dezimale Ganzzahlzeichenfolge über einen angemessenen Wertebereich handelt, können Sie Folgendes tun:
function isNormalInteger(str) {
var n = Math.floor(Number(str));
return n !== Infinity && String(n) === str && n >= 0;
}
oder wenn Sie Leerzeichen und führende Nullen zulassen möchten:
function isNormalInteger(str) {
str = str.trim();
if (!str) {
return false;
}
str = str.replace(/^0+/, "") || "0";
var n = Math.floor(Number(str));
return n !== Infinity && String(n) === str && n >= 0;
}
Live-Testbed (ohne Behandlung von führenden Nullen oder Leerzeichen):
function isNormalInteger(str) {
var n = Math.floor(Number(str));
return n !== Infinity && String(n) === str && n >= 0;
}
function gid(id) {
return document.getElementById(id);
}
function test(str, expect) {
var result = isNormalInteger(str);
console.log(
str + ": " +
(result ? "Yes" : "No") +
(expect === undefined ? "" : !!expect === !!result ? " <= OK" : " <= ERROR ***")
);
}
gid("btn").addEventListener(
"click",
function() {
test(gid("text").value);
},
false
);
test("1", true);
test("1.23", false);
test("1234567890123", true);
test("1234567890123.1", false);
test("0123", false); // false because we don't handle leading 0s
test(" 123 ", false); // false because we don't handle whitespace
<label>
String:
<input id="text" type="text" value="">
<label>
<input id="btn" type="button" value="Check">
Live-Testbed ( mit Behandlung für führende Nullen und Leerzeichen):
function isNormalInteger(str) {
str = str.trim();
if (!str) {
return false;
}
str = str.replace(/^0+/, "") || "0";
var n = Math.floor(Number(str));
return String(n) === str && n >= 0;
}
function gid(id) {
return document.getElementById(id);
}
function test(str, expect) {
var result = isNormalInteger(str);
console.log(
str + ": " +
(result ? "Yes" : "No") +
(expect === undefined ? "" : !!expect === !!result ? " <= OK" : " <= ERROR ***")
);
}
gid("btn").addEventListener(
"click",
function() {
test(gid("text").value);
},
false
);
test("1", true);
test("1.23", false);
test("1234567890123", true);
test("1234567890123.1", false);
test("0123", true);
test(" 123 ", true);
<label>
String:
<input id="text" type="text" value="">
<label>
<input id="btn" type="button" value="Check">
Wenn Sie nicht zulassen möchten 0, wechseln Sie einfach >= 0zu > 0. (Oder entfernen Sie in der Version, die führende Nullen zulässt, die || "0"in der replaceZeile.)
Wie das funktioniert:
In der Version, die Leerzeichen und führende Nullen zulässt:
str = str.trim(); Entfernt alle führenden und nachfolgenden Leerzeichen.
if (!str) fängt eine leere Zeichenfolge ab und kehrt zurück, was keinen Sinn macht, den Rest der Arbeit zu erledigen.
str = str.replace(/^0+/, "") || "0"; Entfernt alle führenden Nullen aus der Zeichenfolge. Wenn dies jedoch zu einer leeren Zeichenfolge führt, wird eine einzelne 0 wiederhergestellt.
Number(str): In streine Zahl konvertieren ; Die Zahl kann durchaus einen Bruchteil haben oder sein NaN.
Math.floor: Schneiden Sie die Zahl ab (hackt einen Bruchteil ab).
String(...): Konvertiert das Ergebnis zurück in eine normale Dezimalzeichenfolge. Für wirklich große Zahlen wird dies in die wissenschaftliche Notation gehen, was diesen Ansatz brechen kann. (Ich weiß nicht genau, wo die Aufteilung ist, die Details sind in der Spezifikation enthalten , aber für ganze Zahlen glaube ich, dass es an dem Punkt ist, an dem Sie 21 Stellen überschritten haben [zu diesem Zeitpunkt ist die Zahl sehr ungenau geworden, wie IEEE-754 Zahlen mit doppelter Genauigkeit haben nur ungefähr 15 Stellen Genauigkeit.)
... === str: Vergleicht das mit der ursprünglichen Zeichenfolge.
n >= 0: Überprüfen Sie, ob es positiv ist.
Beachten Sie, dass dies für die Eingabe fehlschlägt, für "+1"jede Eingabe in wissenschaftlicher Notation, die zu diesem String(...)Zeitpunkt nicht wieder in dieselbe wissenschaftliche Notation umgewandelt wird , und für jeden Wert, den die Art der von JavaScript verwendeten Zahl verwendet (binärer Gleitkomma mit doppelter Genauigkeit nach IEEE-754). kann nicht genau darstellen, welche Analyse näher an einem anderen Wert als dem angegebenen liegt (der viele ganze Zahlen über 9.007.199.254.740.992 enthält; zum Beispiel 1234567890123456789wird fehlschlagen). Ersteres ist eine einfache Lösung, die beiden letzteren nicht so sehr.
Regulären Ausdruck
Der andere Ansatz besteht darin, die Zeichen der Zeichenfolge über einen regulären Ausdruck zu testen, wenn Ihr Ziel darin besteht, nur eine Option +gefolgt von einer 0oder einer Zeichenfolge im normalen Dezimalformat zuzulassen (z. B.) :
function isNormalInteger(str) {
return /^\+?(0|[1-9]\d*)$/.test(str);
}
Live-Testumgebung:
function isNormalInteger(str) {
return /^\+?(0|[1-9]\d*)$/.test(str);
}
function gid(id) {
return document.getElementById(id);
}
function test(str, expect) {
var result = isNormalInteger(str);
console.log(
str + ": " +
(result ? "Yes" : "No") +
(expect === undefined ? "" : !!expect === !!result ? " <= OK" : " <= ERROR ***")
);
}
gid("btn").addEventListener(
"click",
function() {
test(gid("text").value);
},
false
);
test("1", true);
test("1.23", false);
test("1234567890123", true);
test("1234567890123.1", false);
test("0123", false); // false because we don't handle leading 0s
test(" 123 ", false); // false because we don't handle whitespace
<label>
String:
<input id="text" type="text" value="">
<label>
<input id="btn" type="button" value="Check">
Wie das funktioniert:
^: Match Anfang der Zeichenfolge
\+?: Erlaube eine einzelne, optionale +(entferne diese, wenn du nicht willst)
(?:...|...): Erlauben Sie eine dieser beiden Optionen (ohne eine Erfassungsgruppe zu erstellen):
(0|...): Allein zulassen 0...
(...|[1-9]\d*): ... oder eine Zahl, die mit etwas anderem als 0und gefolgt von einer beliebigen Anzahl von Dezimalstellen beginnt .
$: Match Ende der Zeichenfolge.
Wenn Sie nicht zulassen möchten 0(weil es nicht positiv ist), wird der reguläre Ausdruck gerecht /^\+?[1-9]\d*$/(z. B. können wir die Abwechslung verlieren, die wir zulassen mussten 0).
Wenn Sie führende Nullen (0123, 00524) zulassen möchten, ersetzen Sie einfach den Wechsel (?:0|[1-9]\d*)durch\d+
function isNormalInteger(str) {
return /^\+?\d+$/.test(str);
}
Wenn Sie Leerzeichen zulassen möchten, fügen Sie diese \s*direkt nach ^und \s*kurz vor hinzu $.
Hinweis für die Umrechnung in eine Zahl: Bei modernen Motoren wäre es wahrscheinlich in Ordnung, sie zu verwenden +stroder Number(str)zu tun, aber ältere Motoren erweitern diese möglicherweise auf eine nicht standardmäßige (aber früher zulässige) Weise, die besagt, dass eine führende Null Oktal bedeutet (Basis 8), z. B. "010" => 8. Sobald Sie die Zahl validiert haben, können Sie sicher parseInt(str, 10)sicherstellen, dass sie als Dezimalzahl analysiert wird (Basis 10). parseIntwürde den Müll am Ende des Strings ignorieren, aber wir haben sichergestellt, dass es keinen mit dem regulären Ausdruck gibt.