Sizin için iki cevap:
Ayrıştırma esasına göre
Düzenli ifade
Her iki durumda da, pozitif 0
olmasa 0
da "pozitif tamsayı" yı içerecek şekilde yorumladığımı unutmayın. İzin vermemek istiyorsanız notlar ekliyorum 0
.
Ayrıştırma Esasına Göre
Makul değerler aralığında normalleştirilmiş ondalık tam sayı dizesi olmasını istiyorsanız, bunu yapabilirsiniz:
function isNormalInteger(str) {
var n = Math.floor(Number(str));
return n !== Infinity && String(n) === str && n >= 0;
}
veya boşluk ve baştaki sıfırlara izin vermek istiyorsanız:
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;
}
Canlı test yatağı (önde gelen sıfırları veya boşlukları kullanmadan):
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">
Canlı test yatağı ( önde gelen sıfırlar ve boşluklar için kullanım ile ):
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">
Eğer izin vermemek istiyorsanız 0
, sadece değiştirmek >= 0
için > 0
. (Veya önde gelen sıfırlara izin veren sürümde || "0"
, replace
satırı kaldırın .)
Bu nasıl çalışır:
Boşluğa ve baştaki sıfırlara izin veren sürümde:
str = str.trim();
ön ve arkadaki beyaz boşlukları kaldırır.
if (!str)
boş bir dize yakalar ve geri döner, işin geri kalanını yapmanın anlamı yoktur.
str = str.replace(/^0+/, "") || "0";
dizeden önde gelen tüm 0'ları kaldırır - ancak bu boş bir dizeyle sonuçlanırsa, tek bir 0'ı geri yükler.
Number(str)
: str
Bir sayıya dönüştürme ; sayının kesirli bir kısmı olabilir veya olabilir NaN
.
Math.floor
: Sayıyı kısaltın (kesirli kısmı keser).
String(...)
: Sonucu tekrar normal ondalık bir dizeye dönüştürür. Gerçekten büyük sayılar için bu, bu yaklaşımı kırabilecek bilimsel gösterime gidecektir. (Bölmenin nerede olduğunu bilmiyorum , detaylar spesifikasyonda , ancak tam sayılar için bunun 21 basamağı aştığınıza inanıyorum [bu zamana kadar sayının çok kesinleşmediği, IEEE-754 çift kesinlikli sayılar sadece 15 basamak hassasiyetle kesişir.)
... === str
: Bunu orijinal dizeyle karşılaştırır.
n >= 0
: Pozitif olup olmadığını kontrol edin.
Bunun "+1"
giriş, bilimsel gösterimdeki herhangi bir girişin String(...)
aşamada aynı bilimsel gösterime dönüşmediği ve JavaScript'in kullandığı sayı türünün (IEEE-754 çift kesinlikli ikili kayan nokta) başarısız olduğunu unutmayın. hangi ayrıştırmaların verili olandan farklı bir değere daha yakın olduğunu doğru bir şekilde gösteremez (örneğin, 9,007,199,254,740,992'den fazla tamsayı içerir; 1234567890123456789
başarısız olur). Birincisi kolay bir düzeltme, ikincisi çok fazla değil.
Düzenli ifade
Diğer yaklaşım, hedefiniz yalnızca isteğe bağlı bir seçeneğe ve +
ardından 0
normal ondalık biçimde bir dizeye veya bir dizeye izin vermek (diyelim) ise, dizenin karakterlerini normal bir ifade aracılığıyla test etmektir :
function isNormalInteger(str) {
return /^\+?(0|[1-9]\d*)$/.test(str);
}
Canlı test yatağı:
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">
Bu nasıl çalışır:
^
: Dizenin maç başlangıcı
\+?
: Tek bir isteğe bağlı izin verin +
(istemiyorsanız bunu kaldırın)
(?:...|...)
: Bu iki seçenekten birine izin verin (bir yakalama grubu oluşturmadan):
(0|...)
: 0
Kendi başına izin ver ...
(...|[1-9]\d*)
: ... veya 0
herhangi bir ondalık basamaktan başka bir şeyle başlayan ve ardından gelen bir sayı.
$
: Dizenin sonuyla eşleşir.
İzin vermemek istiyorsanız 0
(olumlu olmadığından), normal ifade sadece olur /^\+?[1-9]\d*$/
(örneğin, izin vermemiz gereken değişimi değiştirebiliriz 0
).
Önce gelen sıfırları (0123, 00524) izin vermek istiyorsanız, o zaman sadece münavebeye yerini (?:0|[1-9]\d*)
ile\d+
function isNormalInteger(str) {
return /^\+?\d+$/.test(str);
}
Boşluğa izin vermek istiyorsanız, \s*
hemen sonra ^
ve \s*
hemen önce ekleyin $
.
Bunu bir sayıya dönüştürdüğünüzde dikkat edin: Modern motorlarda muhtemelen kullanmak +str
veya Number(str)
yapmak iyi olur, ancak daha eski olanlar standart olmayan (ancak daha önce izin verilmiş) bir şekilde önde gelen sıfır anlamına gelen sekizlik anlamına gelir. (taban 8), örneğin "010" => 8. Numarayı doğruladıktan sonra, parseInt(str, 10)
ondalık olarak ayrıştırılmasını sağlamak için güvenle kullanabilirsiniz (taban 10). parseInt
dizenin sonunda çöpü görmezden gelirdi, ama normal ifadeyle hiç bir şey olmadığından emin olduk.