236

最も簡単なフェイルセーフテストで、JavaScriptの文字列が正の整数であることを確認したいと思います。

isNaN(str)あらゆる種類の非整数値に対してtrueを返しparseInt(str)、「2.5」などの浮動小数点文字列に対して整数を返します。また、jQueryプラグインも使用する必要はありません。

4

14 に答える 14

347

あなたのための2つの答え:

  • 構文解析に基づく

  • 正規表現

0どちらの場合も、正ではありませんが、「正の整数」はを含むと解釈していることに注意してください0。許可しない場合はメモを含めます0

構文解析に基づく

妥当な値の範囲で正規化された10進整数文字列にしたい場合は、次のようにすることができます。

function isInDesiredForm(str) {
    var n = Math.floor(Number(str));
    return n !== Infinity && String(n) === str && n >= 0;
}

または、空白と先行ゼロを許可する場合:

function isInDesiredForm(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 isInDesiredForm(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 = isInDesiredForm(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 isInDesiredForm(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 = isInDesiredForm(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行のを削除します。)

それがどのように機能するか:

  1. 空白と先行ゼロを許可するバージョンでは、次のようになります。
  • str = str.trim();先頭と末尾のホワイトペースを削除します。
  • if (!str)空白の文字列をキャッチして戻ります。残りの作業を行う意味はありません。
  • str = str.replace(/^0+/, "") || "0";文字列から先頭の0をすべて削除しますが、結果として空白の文字列になる場合は、単一の0を復元します。
  1. Number(str):数値に変換strします。数は小数部分である場合もあれば、である場合もありますNaN

  2. Math.floor:数値を切り捨てます(小数部分を切り取ります)。

  3. String(...):結果を通常の10進文字列に変換し直します。非常に大きな数の場合、これは科学的記数法になり、このアプローチを破る可能性があります。(分割がどこにあるかはよくわかりません。詳細は仕様にありますが、整数の場合は、21桁を超えた時点であると思います[その時点で、IEEE-754のように数値は非常に不正確になっています。倍精度の数値は、おおよそ15桁の精度しかありません。)

  4. ... === str:それを元の文字列と比較します。

  5. n >= 0:ポジティブであることを確認してください。

"+1"これは、入力、その段階で同じ科学的記数法に戻らない科学的記数法の入力String(...)、およびJavaScriptが使用する数値の種類(IEEE-754倍精度2進浮動小数点)では失敗することに注意してください。どの解析が指定された値とは異なる値に近いかを正確に表すことはできません(9,007,199,254,740,992を超える多くの整数が含まれます。たとえば、1234567890123456789失敗します)。前者は簡単な修正ですが、後者の2つはそれほど簡単ではありません。

正規表現

もう1つのアプローチは、正規表現を介して文字列の文字をテストすることです。目標が、オプションの+0に通常の10進形式のいずれかまたは文字列を続けることだけを許可することである場合:

function isInDesiredForm(str) {
    return /^\+?(0|[1-9]\d*)$/.test(str);
}

ライブテストベッド:

function isInDesiredForm(str) {
    return /^\+?(0|[1-9]\d*)$/.test(str);
}
function gid(id) {
    return document.getElementById(id);
}
function test(str, expect) {
    var result = isInDesiredForm(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">

それがどのように機能するか:

  1. ^:文字列の先頭に一致

  2. \+?:単一のオプションを許可します+(必要がない場合はこれを削除します)

  3. (?:...|...):次の2つのオプションのいずれかを許可します(キャプチャグループを作成せずに):

  4. (0|...):それ自体で許可0します...

  5. (...|[1-9]\d*):...または、他の数字で始まり0、その後に任意の数の10進数が続く数字。

  6. $:文字列の終わりに一致します。

許可しない場合0(正ではないため)、正規表現は正になります/^\+?[1-9]\d*$/(たとえば、許可するために必要な代替を失う可能性があります0)。

先行ゼロ(0123、00524)を許可する場合は、交互に次のように置き換えます(?:0|[1-9]\d*)\d+

function isInDesiredForm(str) {
    return /^\+?\d+$/.test(str);
}

空白を許可する場合は、\s*直後^\s*直前に追加し$ます。

これを数値に変換する場合の注意:最近のエンジンでは、使用+strまたは実行するのはおそらく問題ありませんが、古いエンジンは、先行ゼロが8進数Number(str)を意味するという非標準の(ただし以前は許可されていた)方法でそれらを拡張する場合があります(基数8)、例: "010" => 8。数値を検証したら、安全に使用して、10進数(基数10)として解析されることを確認できます。文字列の最後にあるガベージを無視しますが、正規表現にはガベージがないことを確認しました。parseInt(str, 10)parseInt

于 2012-05-31T13:42:08.480 に答える
85

解決策1

JavaScriptの整数を最大値(つまり)と見なすと、次の短い解決策が完全に機能します。4294967295Math.pow(2,32)-1

function isPositiveInteger(n) {
    return n >>> 0 === parseFloat(n);
}

説明:

  1. ゼロフィル右シフト演算子は、次の3つの重要なことを行います。
    • 小数部を切り捨てます
      • 123.45 >>> 0 === 123
    • 負の数のシフトを行います
      • -1 >>> 0 === 4294967295
    • の範囲で「動作」MAX_INT
      • 1e10 >>> 0 === 1410065408
      • 1e7 >>> 0 === 10000000
  2. parseFloat文字列番号の正しい解析を行います(NaN数値以外の文字列の設定)

テスト:

"0"                     : true
"23"                    : true
"-10"                   : false
"10.30"                 : false
"-40.1"                 : false
"string"                : false
"1234567890"            : true
"129000098131766699.1"  : false
"-1e7"                  : false
"1e7"                   : true
"1e10"                  : false
"1edf"                  : false
" "                     : false
""                      : false

デモ:http: //jsfiddle.net/5UCy4/37/


解決策2

Number.MAX_VALUE別の方法は、まで、つまり約1.7976931348623157e+308:まで有効なすべての数値に適しています。

function isPositiveInteger(n) {
    return 0 === n % (!isNaN(parseFloat(n)) && 0 <= ~~n);
}

説明:

  1. !isNaN(parseFloat(n))純粋な文字列値""をフィルタリングするために使用され" "ます"string"
  2. 0 <= ~~n負の値と大きな非整数値をフィルタリングし"-40.1"ます"129000098131766699"
  3. (!isNaN(parseFloat(n)) && 0 <= ~~n)値が数値trueの両方の場合に戻ります;
  4. 0 === n % (...)値が非浮動であるかどうかをチェックします-ここ(3を参照)は、の場合とのように、およびの場合のように(...)評価されます。0false1true

テスト:

"0"                     : true
"23"                    : true
"-10"                   : false
"10.30"                 : false
"-40.1"                 : false
"string"                : false
"1234567890"            : true
"129000098131766699.1"  : false
"-1e10"                 : false
"1e10"                  : true
"1edf"                  : false
" "                     : false
""                      : false

デモ:http: //jsfiddle.net/5UCy4/14/


以前のバージョン:

function isPositiveInteger(n) {
    return n == "0" || ((n | 0) > 0 && n % 1 == 0);
}

デモ:http: //jsfiddle.net/5UCy4/2/

于 2012-05-31T14:05:17.980 に答える
26

ノードおよびすべてのブラウザー(IEとOpera Miniを除く)の90%以上で機能する最新のソリューションは、Number.isIntegerを使用した後、単純なポジティブチェックを行うことです。

Number.isInteger(x) && x > 0

これはECMAScript2015で完成しました

function isPositiveInteger(x) {
    return Number.isInteger(x) && x > 0
}

ポリフィルは次のとおりです。

Number.isInteger = Number.isInteger || function(value) {
  return typeof value === 'number' && 
    isFinite(value) && 
    Math.floor(value) === value;
};

文字列または数値形式の入力をサポートする必要がある場合は、この関数を使用できます。既存のすべての回答(2018年2月1日)が何らかの形式の入力で失敗した後、私は大規模なテストスイートを作成しました。

function isPositiveInteger(v) {
  var i;
  return v && (i = parseInt(v)) && i > 0 && (i === v || ''+i === v);
}
于 2018-02-01T18:17:32.787 に答える
25

正規表現が進むべき道のように見えます:

var isInt = /^\+?\d+$/.test('the string');
于 2012-05-31T13:41:15.723 に答える
10

ES6:

Number.isInteger(Number(theNumberString)) && Number(theNumberString) > 0
于 2020-06-28T11:34:31.007 に答える
5

これは、文字列が正の整数であることを検証する方法です。

var str = "123";
var str1 = "1.5";
var str2 = "-123";

console.log("is str positive integer: ", Number.isInteger(Number(str)) && Number(str) > 0)
console.log("is str1 positive integer: ", Number.isInteger(Number(str1)) && Number(str1) > 0)
console.log("is str2 positive integer: ", Number.isInteger(Number(str2)) && Number(str2) > 0)

于 2020-08-20T06:32:21.347 に答える
4

これは、これとほぼ同じ質問です。

JavaScriptで10進数を検証する-IsNumeric()

答えは次のとおりです。

function isNumber(n) {
  return !isNaN(parseFloat(n)) && isFinite(n);
}

したがって、正の整数は次のようになります。

function isPositiveInteger(n) {
  var floatN = parseFloat(n);
  return !isNaN(floatN) && isFinite(n) && floatN > 0
      && floatN % 1 == 0;
}
于 2012-05-31T13:46:53.790 に答える
2
return ((parseInt(str, 10).toString() == str) && str.indexOf('-') === -1);

ただし、「0001」のような文字列を指定すると機能しません

于 2012-05-31T13:45:28.270 に答える
2

私の関数は、数値が+ veであるかどうかをチェックし、10進数値を持つこともできます。

       function validateNumeric(numValue){
            var value = parseFloat(numValue);
            if (!numValue.toString().match(/^[-]?\d*\.?\d*$/)) 
                    return false;
            else if (numValue < 0) {
                return false;
            }
            return true;        
        }
于 2015-06-20T07:55:44.310 に答える
2

上記のVisioNの回答に基づいて構築するために、jQuery検証プラグインを使用している場合は、次のように使用できます。

$(document).ready(function() {
    $.validator.addMethod('integer', function(value, element, param) {
        return (value >>> 0 === parseFloat(value) && value > 0);
    }, 'Please enter a non zero integer value!');
}

次に、通常のルールセットで使用するか、次のように動的に追加します。

$("#positiveIntegerField").rules("add", {required:true, integer:true});
于 2015-08-14T19:10:58.663 に答える
2

単純

function isInteger(num) {
  return (num ^ 0) === num;
}

console.log(isInteger(1));

Numberを拡張し、プロトタイプを介して関数を割り当てることもできます。

于 2018-07-10T06:37:39.347 に答える
1

HTML5フォームを使用している場合はmin="0"、フォーム要素の属性を使用できます<input type="number" />。これは、すべての主要なブラウザでサポートされています。このような単純なタスクにはJavascriptは含まれませんが、新しいhtml標準に統合されています。https://www.w3schools.com/tags/att_input_min.aspに記載されています

于 2017-05-08T14:58:17.457 に答える
1

ほとんどの場合、文字列が有効なuserIdであるかどうかのチェックなど、データベースの使用状況についてこのタイプのチェックが必要です。そのため、整数として解析できる奇妙な記号はあり得ません。また、整数はデータベースの整数の範囲内にある必要があります。1,2,3などの通常のintが必要です。

const isStrNormPosInt = (str: string) => {
  return /^([1-9]\d*)$/.test(str) && Number(str) <= 2147483647 // postgres max int
}

チェックに合格した場合は、数値に変換するだけです。Number(str)

于 2020-10-22T14:26:37.287 に答える
0

(~~a == a)文字列はどこにありますかa

于 2014-04-01T21:49:59.723 に答える