type =“ number”を正の数のみにする方法


284

現在私は次のコードを持っています

<input type="number" />

こんな感じで出てきます

ここに画像の説明を入力してください

右側の小さなセレクターにより、数値をマイナスにすることができます。それを防ぐにはどうすればよいですか?

を使用することに疑問type="number"があります。解決するよりも多くの問題が発生していtype="text"ます。とにかくそれをサニティチェックするつもりなので、使用に戻るべきですか?


4
サーバーで値を検証する必要があります。誰でもフィールドをオーバーライドして、必要なコンテンツを送信できます。
zzzzBov 2013年

2
@zzzzBovええ、私はそれをphpで検証し、prepareステートメントも使用します。心配する必要があるのは、大麦のWebブラウザーの使用方法を知っているユーザーだけです。笑
アリアンフォールトッシュ2013年

回答:


634

属性を追加するmin

<input type="number" min="0">


36
これはセレクター矢印で機能しますが、負の数値を入力できます
David Burton

2
属性をに変更するmin="0.000001"と、ほとんどの場合に役立ちます。小数点以下6桁以上の場合、JavaScriptはそれを指数形式に変換します。
MarkMYoung

デフォルトでは、これは整数のみを許可し、小数は許可しません。10進数値の許可を参照してください。
str

118

負の数を防ぐ別の解決策を見つけました。

<input type="number" name="test_name" min="0" oninput="validity.valid||(value='');">

これで浮動小数点数を追加することはできません。また、数値ステッパーもここでは機能しません。
hamzox 2018年

1
oninput="validity.valid||(value='');"が数字を入力するのを止める
Hello Universe

5
「-」文字の入力も防止されるため、これは有効な回答としてマークする必要があります
JanBrus

これは、私が行ったように、正の整数のみが必要な場合に最適です。ありがとう!
ボリス

74

どれだけ正確になりたいかによります。整数のみを受け入れたい場合:

<input type="number" min="1" step="1">

たとえば、小数点以下2桁の浮動小数点数が必要な場合:

<input type="number" min="0.01" step="0.01">


現在、step = "1"なしで動作しているようです...それでも追加する必要がありますか?
Arian Faurtosh 2013年

@Arianは、max値を指定しない限り、省略できます。
Pavlo 2013年

1
ステップ1はブラウザのデフォルトです。問題ありません
ステファンミュラー

4
これは、不正な値の入力を妨げることはありません。ステップ値を省略した場合、クロムは入力時の検証を減らし、数値以外の値を入力できるようにします。ステップセットでは、min-maxの範囲外の値を入力することしかできません。
David Burton

min = "1" step = "1"でも、1.2のような浮動小数点数を入力できます。どうすれば整数のみを強制できますか?
2016

50

タグonkeypress内に追加することで、入力に正の整数のみを含めるように強制できinputます。

<input type="number" onkeypress="return event.charCode >= 48" min="1" >

ここでevent.charCode >= 48は、0以上の数値のみが返されるminようにしていますが、タグは、入力バー内をスクロールして最低1に到達できることを保証します。


3
エッジでは、これに「A」を入力できます。
エイミーブランケンシップ

10
あなたはまだ負の数を貼り付けることができます
メチル

5

以下を使用して、type="number"正の数のみを受け入れるようにすることができます。

input type="number" step="1" pattern="\d+"

2
あなたの発言が何をするのか、なぜそれが役立つのか説明してみませんか?また、2つの異なるスニペットがあります。どちらが正しいか?
Aenadon 2018

2
step属性を追加することで、入力を整数に制限し、パターンを追加すると、小数部分を使用するとフィールドが無効としてマークされますが、ブラウザーの実装に依存します(Firefoxは、入力がフォーカスを失ったときにフィールドを赤としてマークしますが、Chromeでは許可されません。許可されていない値を最初に入力した場合)。サーバー/クライアントでこれを検証する必要があります。
Deepali 2018



1

テキスト入力が必要な場合、パターンも機能します

<input type="text" pattern="\d+">

1

入力には効果があるがコピーと貼り付けには効果がないため、完璧な解決策が見つかりません。逆の場合もあります。この解決策は私にとってはうまくいきます。負の数を防ぐため、「e」と入力し、「e」のテキストをコピーして貼り付けます。

関数を作成します。

<script language="JavaScript">

  // this prevents from typing non-number text, including "e".
  function isNumber(evt) {
    evt = (evt) ? evt : window.event;
    let charCode = (evt.which) ? evt.which : evt.keyCode;
    if ((charCode > 31 && (charCode < 48 || charCode > 57)) && charCode !== 46) {
      evt.preventDefault();
    } else {
      return true;
    }
  }
</script>

これらのプロパティを入力に追加します。この2つは、「e」を含む非数値テキストのコピーと貼り付けを防止します。有効にするには両方を組み合わせる必要があります。

<input type="number" oninput="validity.valid||(value='');" onpress="isNumber(event)" />

Vue 使用している場合は、この回答をここで参照できます。再利用できるミックスインに抽出しました。


0

このコードを入力タイプに追加します。

onkeypress="return (event.charCode == 8 || event.charCode == 0 || event.charCode == 13) ? null : event.charCode >= 48 && event.charCode <= 57"

例えば:

<input type="text" name="age" onkeypress="return (event.charCode == 8 || event.charCode == 0 || event.charCode == 13) ? null : event.charCode >= 48 && event.charCode <= 57" />

1
これは、何が起こっているのか理解していない人にとっては本当に混乱します。
RozzA 2017年

このように、あなたはまだ入力、アルファベット、あるいは特殊文字の上に何かを貼り付けることができます
Lêジアル

0

他の解決策は、Jsを使用して正にすることです(minオプションは無効にでき、ユーザーがsmthを入力すると無効になります)必要でない場合は負で、on( 'keydown')イベントも使用できます!

let $numberInput =  $('#whatEverId');
$numberInput.on('change', function(){
    let numberInputText = $numberInput.val();
    if(numberInputText.includes('-')){
        $numberInput.val(Math.abs($numberInput.val()));
    }
});

0

intフィールドとfloatフィールドのどちらが必要かによって異なります。2つは次のようになります。

<input type="number" name="int-field" id="int-field" placeholder="positive int" min="1" step="1">
<input type="number" name="float-field" id="float-field" placeholder="positive float" min="0">

intフィールドには、minが1であるため、正しい検証が関連付けられています。ただし、floatフィールドは0を受け入れます。これに対処するには、制約バリデーターをもう1つ追加します。

function checkIsPositive(e) {
  const value = parseFloat(e.target.value);
  if (e.target.value === "" || value > 0) {
    e.target.setCustomValidity("");
  } else {
    e.target.setCustomValidity("Please select a value that is greater than 0.");
  }
}

document.getElementById("float-field").addEventListener("input", checkIsPositive, false);

JSFiddleはこちら。

これらのソリューションはいずれも、ユーザーが無効な入力を入力しようとするのを完全に防ぐことはできませんが、呼び出しcheckValidityたりreportValidity、ユーザーが有効な入力を入力したかどうかを確認したりできます。

もちろん、ユーザーは常にクライアント側の検証を無視できるため、サーバー側の検証も必要です。


0

これを試して:

  • Angular 8でテスト済み
  • 値は正です
  • このコードはnullnegitive値と値も扱います。
              <input
                type="number"
                min="0"
                (input)="funcCall()" -- Optional
                oninput="value == '' ? value = 0 : value < 0 ? value = value * -1 : false"
                formControlName="RateQty"
                [(value)]="some.variable" -- Optional
              />

0

負の数を入力しようとすると、onkeyupイベントがこれをブロックし、入力数の矢印を使用すると、onblurイベントがその部分を解決します。

<input type="number" 
    onkeyup="if(this.value<0)this.value=1"
    onblur="if(this.value<0)this.value=1"
>



-2

テキストタイプの入力では、これを使用してより良い検証を行うことができます。

return (event.keyCode? (event.keyCode == 69 ? false : event.keyCode >= 48 && event.keyCode <= 57) : (event.charCode >= 48 && event.charCode <= 57))? true : event.preventDefault();

-4

これを試して:

Yii2 : Validation rule 

    public function rules() {
    return [
['location_id', 'compare', 'compareValue' => 0', 'operator' => '>'],
        ];
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.