Dwie odpowiedzi dla ciebie:
Na podstawie analizy
Wyrażenie regularne
Zauważ, że w obu przypadkach zinterpretowałem „dodatnią liczbę całkowitą”, aby uwzględnić 0, chociaż 0nie jest dodatnia. Załączam notatki, jeśli chcesz się nie zgadzać 0.
Na podstawie analizy
Jeśli chcesz, aby był to znormalizowany dziesiętny ciąg liczb całkowitych w rozsądnym zakresie wartości, możesz to zrobić:
function isNormalInteger(str) {
var n = Math.floor(Number(str));
return n !== Infinity && String(n) === str && n >= 0;
}
lub jeśli chcesz zezwolić na białe spacje i zera wiodące:
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;
}
Aktywna platforma testowa (bez obsługi wiodących zer i białych znaków):
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">
Aktywna platforma testowa ( z obsługą wiodących zer i białych znaków):
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">
Jeśli chcesz zabronić 0, po prostu zmień >= 0na > 0. (Lub w wersji, która pozwala na zera na początku, usuń znak || "0"w replacewierszu).
Jak to działa:
W wersji ze spacjami i wiodącymi zerami:
str = str.trim(); usuwa wszelkie wiodące i końcowe białe znaki.
if (!str) łapie pusty ciąg i wraca, nie ma sensu wykonywać reszty pracy.
str = str.replace(/^0+/, "") || "0"; usuwa wszystkie wiodące zera z ciągu - ale jeśli wynikiem jest pusty ciąg, przywraca pojedyncze 0.
Number(str): Konwertuj strna liczbę; liczba może również zawierać ułamek lub może być NaN.
Math.floor: Obetnij liczbę (odcina każdą część ułamkową).
String(...): Konwertuje wynik z powrotem na normalny ciąg dziesiętny. W przypadku naprawdę dużych liczb przejdzie to do notacji naukowej, co może złamać to podejście. (Nie do końca wiem, gdzie jest podział, szczegóły podano w specyfikacji , ale wydaje mi się, że w przypadku liczb całkowitych przekroczyłeś 21 cyfr [do tego czasu liczba stała się bardzo nieprecyzyjna, ponieważ IEEE-754 Liczby o podwójnej precyzji mają tylko 15 cyfr dokładności ..)
... === str: Porównuje to do oryginalnego ciągu.
n >= 0: Sprawdź, czy to jest pozytywne.
Zauważ, że nie powiedzie się to dla danych wejściowych "+1", dowolnych danych w notacji naukowej, które nie zamieniają się z powrotem w tę samą notację naukową na String(...)etapie, i dla każdej wartości, której używa rodzaj kodu JavaScript (zmiennoprzecinkowa podwójna precyzja IEEE-754) nie może dokładnie przedstawić, która parsuje jako bliżej innej wartości niż podana (która zawiera wiele liczb całkowitych powyżej 9 007,199,254,740,992; na przykład 1234567890123456789zawiedzie). Pierwsza z nich jest łatwa do rozwiązania, a druga nie tyle.
Wyrażenie regularne
Drugim podejściem jest przetestowanie znaków ciągu za pomocą wyrażenia regularnego, jeśli Twoim celem jest po prostu (powiedzmy) opcjonalny ciąg, +po którym następuje jeden 0lub ciąg w normalnym formacie dziesiętnym:
function isNormalInteger(str) {
return /^\+?(0|[1-9]\d*)$/.test(str);
}
Live testbed:
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">
Jak to działa:
^: Dopasuj początek łańcucha
\+?: Zezwól na jeden, opcjonalny +(usuń to, jeśli nie chcesz)
(?:...|...): Zezwól na jedną z tych dwóch opcji (bez tworzenia grupy przechwytywania):
(0|...): Pozwól 0sam ...
(...|[1-9]\d*): ... lub liczbę rozpoczynającą się od czegoś innego niż, 0po której następuje dowolna liczba cyfr dziesiętnych.
$: Dopasuj koniec łańcucha.
Jeśli chcesz zabronić 0(ponieważ nie jest to pozytywne), wyrażenie regularne staje się po prostu /^\+?[1-9]\d*$/(np. Możemy stracić alternatywę, na którą musieliśmy pozwolić 0).
Jeśli chcesz, aby umożliwić zer (0123, 00524), a następnie po prostu zastąpić przemienności (?:0|[1-9]\d*)z\d+
function isNormalInteger(str) {
return /^\+?\d+$/.test(str);
}
Jeśli chcesz zezwolić na białe znaki, dodaj \s*tuż po ^i \s*tuż przed $.
Uwaga: kiedy konwertujesz to na liczbę: w nowoczesnych silnikach prawdopodobnie dobrze byłoby użyć +strlub Number(str)zrobić to, ale starsze mogą rozszerzyć je w niestandardowy (ale wcześniej dozwolony) sposób, który mówi, że wiodące zero oznacza liczbę ósemkową (podstawa 8), np. „010” => 8. Po sprawdzeniu poprawności liczby można bezpiecznie użyć, parseInt(str, 10)aby upewnić się, że jest ona przetwarzana jako dziesiętna (podstawa 10). parseIntzignorowałby śmieci na końcu łańcucha, ale upewniliśmy się, że nie ma żadnego z wyrażeniem regularnym.