JavaScriptで、正規表現を使ってinputタグに入力された値が整数値かどうかを判別したい\r\n
\r\n```\r\n```JavaScript\r\n//inputのidを取得\r\nconst fizzNum = document.getElementById('fizz');\r\n\r\n//整数をチェックする関数\r\nfunction isNumber(numVal){\r\n    var pattern = /^[-]?([1-9]\\d*|0)(.\\d+)?$/;\r\n    return pattern.test(numVal);\r\n  }\r\n\r\n//戻り値を変数に格納\r\n  let integerCheck = isNumber(fizzNum);\r\n\r\n//クリック時の処理\r\nbtn.addEventListener('click', () => {\r\n    if (integerCheck == true) {\r\n    alert('整数値です');\r\n  } else if (integerCheck == false) {\r\n      alert('整数値ではありません');\r\n  }\r\n}, false);\r\n```\r\n整数値を入力しているのに、「整数値ではありません」のアラートが出現してしまう。\r\n\r\n## 個人的な考え\r\n関数の引数に問題があると考える。\r\n引数のinputタグで入力される値は文字列なので、そのせいでおかしくなっている。","answerCount":3,"upvoteCount":0,"datePublished":"2020-07-18T23:50:36.541Z","dateModified":"2020-07-18T23:50:36.541Z","acceptedAnswer":{"@type":"Answer","text":"まずは自分ならこうするという実例です。\r\n\r\n\r\n/*追記*/\r\n元のコードを修正してみました。\r\n\r\n  ","dateModified":"2020-07-19T03:39:53.786Z","datePublished":"2020-07-19T02:35:16.717Z","upvoteCount":0,"url":"https://teratail.com/questions/278782#reply-396967"},"suggestedAnswer":[{"@type":"Answer","text":"整数の定義次第ですね\r\n- 「0123」的な8進数の整数\r\n- 「12e3」のような精度表記の整数(?)\r\n- 「123.0」のような小数点をもった実質整数(?)\r\n\r\n単純に数値のチェックだとこんな感じ\r\n```javascript\r\n\r\n\r\n\r\n
\r\n\r\n```","dateModified":"2020-07-19T02:13:53.965Z","datePublished":"2020-07-19T02:13:53.965Z","upvoteCount":1,"url":"https://teratail.com/questions/278782#reply-396963","comment":[{"@type":"Comment","text":"バリデーションはともかくinput要素なら\r\ntype=\"number\"とか、patternの設定とかで弾くことはできます","datePublished":"2020-07-19T02:15:45.936Z","dateModified":"2020-07-19T02:15:45.936Z"},{"@type":"Comment","text":"ありがとうございます。\r\n今回は自己成長のためにtype=\"number\"を使わずに実装したかったので\"text\"を採用しました。\r\n8進数のことを考えていなかったので、次はそこも意識してトライしてみます。","datePublished":"2020-07-19T03:16:41.861Z","dateModified":"2020-07-19T03:16:41.861Z"}]},{"@type":"Answer","text":"> 関数の引数に問題があると考える。\r\n\r\nいいえ。\r\nまず「ボタンクリックしたとき」の値をチェックしていません。\r\n画面読み込んだときの値になってるので、何も初期値なければ空ですよね。\r\n\r\nもう1点。\r\n`document.getElementById('fizz')`そのまま突っ込んでるので、「入力値」ではなく「要素そのもの」に対するチェックになってます。\r\n\r\n上記2点、対応してみてください。","dateModified":"2020-07-19T00:02:17.026Z","datePublished":"2020-07-19T00:02:17.026Z","upvoteCount":1,"url":"https://teratail.com/questions/278782#reply-396953","comment":[{"@type":"Comment","text":"「ボタンをクリックした時」の値のチェックというのは、addEventListenerの第2引数を用いてチェックするのでしょうか?","datePublished":"2020-07-19T01:30:40.869Z","dateModified":"2020-07-19T01:30:40.869Z"},{"@type":"Comment","text":"まず、やってみてください。\r\n「クリック時の処理に書いていない」という指摘ですが、どのときにどこを通っているかデバッグしてみれば分かります。","datePublished":"2020-07-19T01:33:06.912Z","dateModified":"2020-07-19T01:33:06.912Z"}]}],"breadcrumb":{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"https://teratail.com","name":"トップ"}},{"@type":"ListItem","position":2,"item":{"@id":"https://teratail.com/tags/JavaScript","name":"JavaScriptに関する質問"}},{"@type":"ListItem","position":3,"item":{"@id":"https://teratail.com/questions/278782","name":"JavaScriptで、正規表現を使ってinputタグに入力された値が整数値かどうかを判別したい"}}]}}}
実現したいこと
ボタンをクリックし、inputタグに入力された文字列が...
・整数値なら、アラートで「整数値です」
・整数値でなければ、アラートで「整数値ではありません」
と表示させたい。
発生している問題
HTMl
1<body>
2<input id="fizz" type="text" size="23"  placeholder="整数値を入力してください" />
3<input id="btn" type="button" value="実行" />
4
5<script src="test.js"></script>
6</body>
JavaScript
1//inputのidを取得
2const fizzNum = document.getElementById('fizz');
3
4//整数をチェックする関数
5function isNumber(numVal){
6    var pattern = /^[-]?([1-9]\d*|0)(.\d+)?$/;
7    return pattern.test(numVal);
8  }
9
10//戻り値を変数に格納
11  let integerCheck = isNumber(fizzNum);
12
13//クリック時の処理
14btn.addEventListener('click', () => {
15    if (integerCheck == true) {
16    alert('整数値です');
17  } else if (integerCheck == false) {
18      alert('整数値ではありません');
19  }
20}, false);
整数値を入力しているのに、「整数値ではありません」のアラートが出現してしまう。
## 個人的な考え
関数の引数に問題があると考える。
引数のinputタグで入力される値は文字列なので、そのせいでおかしくなっている。
整数の定義次第ですね
- 「0123」的な8進数の整数
- 「12e3」のような精度表記の整数(?)
- 「123.0」のような小数点をもった実質整数(?)
単純に数値のチェックだとこんな感じ
javascript
1<script>
2window.addEventListener('DOMContentLoaded', ()=>{
3  document.querySelector('#btn').addEventListener('click',()=>{
4    var v=document.querySelector('#fizz').value;
5    var view=document.querySelector('#view');
6    view.textContent=/^([1-9]+\d*|0)$/.test(v)?"ok":"ng";
7  });
8});
9console.log(0123);
10console.log(12e3);
11console.log(123.0);
12</script>
13<input id="fizz" type="text" size="23"  placeholder="整数値を入力してください">
14<input id="btn" type="button" value="実行">
15<div id="view"></div>
16
関数の引数に問題があると考える。
いいえ。
まず「ボタンクリックしたとき」の値をチェックしていません。
画面読み込んだときの値になってるので、何も初期値なければ空ですよね。
もう1点。
document.getElementById('fizz')そのまま突っ込んでるので、「入力値」ではなく「要素そのもの」に対するチェックになってます。
上記2点、対応してみてください。
 ベストアンサー
ベストアンサー
まずは自分ならこうするという実例です。
<script>
    //整数をチェックする関数
    const checkNum = () => {
      //クリックされた時点でのfizzに入力された値
      const num = document.getElementById('fizz').value;
      //入力された文字列が0以上の半角数字であるならば
      //「整数値です」と表示、違うのであれば「整数値ではありません」と表示
      // ※今回は001 0200 などは許容しないようにしています。
      num.match(/^([1-9]\d*|0)$/) ? alert('整数値です') : alert('整数値ではありません');
    }
    //クリック時の処理
    btn.addEventListener('click', () => {
      checkNum();
    }, false);
</script>
/追記/
元のコードを修正してみました。
  <script>
    //inputのidを取得
    const fizzNum = document.getElementById('fizz');
    //整数をチェックする関数
    function isNumber(numVal) {
      /*
      
      * var pattern = /^[-]?([1-9]\d*|0)(.\d+)?$/;
      
        1つ目の間違いはここです。これでは整数ではなく
        少数や-1なども許可してしまいます。ほかの方も言っている通り
        整数の定義によりますが、今回は半角かつ整数の数字のみ、001などは
        許容しないようにしてみました。
        ※varはなるべく使わないほうが良いのでconstにしました。
      
      */
      const pattern = /^([1-9]\d*|0)$/;
      /*
      
      * return pattern.test(numVal);
      
      二つ目の間違いはここです。
      これでは、fizzNumを参照してしまい、
      入力した値は参照されません。
      入力した値を参照するため .valueを追加します。
      
      */
      return pattern.test(numVal.value);
    }
    /*
    
     * //戻り値を変数に格納
     * let integerCheck = isNumber(fizzNum);
    
    ここが最後の間違いです。これでは入力する前にisNumber関数を
    実行してしまいます。そのためここは記述自体を削除します。
    
    */
    //クリック時の処理
    btn.addEventListener('click', () => {
      /*
      クリックした時点でisNumber関数を実行するため
      下記にintegerCheckを移動しました。※letである必要はないのでconstにしました。
      */
      const integerCheck = isNumber(fizzNum);
      if (integerCheck == true) {
        alert('整数値です');
      } else if (integerCheck == false) {
        alert('整数値ではありません');
      }
    }, false);
  </script>
15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.29%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる