あなたのための2つの答え:
どちらの場合でも、「正の整数」にはが含まれる0と解釈していることに注意してください。0が、正ではありません。禁止したい場合は、メモを含めます0。
解析に基づく
妥当な値の範囲で正規化された10進整数文字列にする場合は、次のようにします。
function isNormalInteger(str) {
var n = Math.floor(Number(str));
return n !== Infinity && String(n) === str && n >= 0;
}
または、空白と先行ゼロを許可する場合:
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;
}
ライブテストベッド(先行ゼロまたは空白を処理しない):
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">
(ライブテストベッドでの先行ゼロと空白のためのハンドリング):
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">
許可しない場合は0、に変更>= 0してください> 0。(または、先行ゼロを許可するバージョンでは|| "0"、replace行のを削除します。)
仕組み:
空白と先行ゼロを許可するバージョンでは:
str = str.trim(); 先頭と末尾のホワイトスペースを削除します。
if (!str) 空の文字列をキャッチして戻ります。残りの作業を行う意味はありません。
str = str.replace(/^0+/, "") || "0"; 文字列からすべての先行0を削除します—ただし、その結果として空白の文字列になる場合は、単一の0を復元します。
Number(str):str数値に変換します。数値は小数部分を含む場合もあれば、の場合もありますNaN。
Math.floor:数値を切り捨てます(小数部分を切り捨てます)。
String(...):結果を通常の10進数文字列に変換します。本当に大きな数の場合、これは科学的表記になり、このアプローチを破る可能性があります。(分割の場所がよくわかりません。詳細は仕様に記載されていますが、整数の場合、21桁を超えた時点であると考えています[IEEE-754のように、その時点で数値は非常に不正確になっています。倍精度の数値は、およそ15桁の精度しかありません。)
... === str:元の文字列と比較します。
n >= 0:ポジティブであることを確認します。
これは、入力"+1"、そのString(...)段階で同じ科学表記に戻らない科学表記の入力、およびJavaScriptが使用する数値の種類(IEEE-754倍精度バイナリ浮動小数点)の場合は失敗します。指定された値(9,007,199,254,740,992を超える多くの整数を含む)とは異なる値に近い解析を正確に表すことはできません。たとえば、1234567890123456789失敗)。前者は簡単な修正ですが、後者の2つはそれほど多くはありません。
正規表現
もう1つのアプローチは、正規表現を介して文字列の文字をテストすることです。目的がオプション(たとえば)の+後0に通常の10進形式の文字列または文字列を許可するだけの場合です。
function isNormalInteger(str) {
return /^\+?(0|[1-9]\d*)$/.test(str);
}
ライブテストベッド:
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">
仕組み:
^:文字列の先頭に一致
\+?:単一のオプションを許可します+(不要な場合は削除してください)
(?:...|...):次の2つのオプションのいずれかを許可します(キャプチャグループを作成せずに):
(0|...):0独自に許可...
(...|[1-9]\d*):...またはそれ以外の数字で始まり0、その後に任意の数の10進数が続く数字。
$:文字列の終わりに一致します。
許可しない場合0(正ではないため)、正規表現はそのままになります/^\+?[1-9]\d*$/(たとえば、許可する必要があった代替を失う可能性があります)0)。
先行ゼロ(0123、00524)を許可する場合は、代替(?:0|[1-9]\d*)を次のものに置き換えます。\d+
function isNormalInteger(str) {
return /^\+?\d+$/.test(str);
}
空白を許可する場合は、\s*直後^と\s*直前に追加します$ます。
これを数値に変換するときの注意:最近のエンジンではおそらく使用+strまたはNumber(str)実行しても問題ありませんが、古いエンジンでは非標準の(以前は許可されていた)方法で拡張され、先行ゼロは8進数を意味します(基数8)、たとえば "010" => 8.数値を検証したら、安全に使用parseInt(str, 10)して、10進数(基数10)として解析されることを確認できます。parseInt文字列の最後にあるゴミは無視しますが、正規表現には何もないことを確認しました。