<input type =“ number”>に小数点以下2桁を許可


221

私が持っている<input type="number">と私は、小数点以下2桁までの小数で純粋に数値または数値へのユーザーの入力を制限したいです。

基本的に、価格の入力をお願いしています。

正規表現を使わないようにしました。それを行う方法はありますか?

<input type="number" required name="price" min="0" value="0" step="any">

2
type = "number"は幅広いブラウザをサポートしていません。希望する入力が確実に得られるように、JavaScriptを備えたテキストボックスを使用することをお勧めします。
www139

6
ええ、でも入力はtype="text"とにかくフォールバックするので、それは何が問題なのでしょうか?
Ultimater


/^\d+\.\d{2,2}$/は0.00を必要とするように機能しました
ZStoneDPM '30 / 10/30

回答:


334

step="any"小数点以下の桁数を許可するの代わりに、step=".01"小数点以下2桁まで許可するを使用します。

仕様の詳細:https : //www.w3.org/TR/html/sec-forms.html#the-step-attribute


38
これは正解ではありません。stepは、クリックまたは押し上げたときに何が起こるかを制御するだけで、何も制限しません。
2018年

1
@Michael_Bは、仕様の期待に関係なく、テストするのはかなり簡単です。jsfiddle.net / 9hvm0b5uでは、2桁を超える小数を入力できます。ステップは、+ /-ボタンが移動する量を制御するだけです。(クローム)
Nathan

3
@Michael_Bユーザーは500.12345、入力のいずれかなどで数値を入力することを妨げられません。おそらく、要件に対する私たちの理解は異なります。
Nathan

3
ユーザーが小数点以下の桁の任意の番号を入力するかもしれないが、ほとんどのブラウザが無効な値を持つフォームの提出とCSSセレクタを許可しないことに留意すべきである:valid:invalid予想されるように適用されます。
Andrew Dinmore

1
@Nathan、ブラウザの検証をテストするのも簡単です。小数点以下2桁以上の値を送信してみてください:jsfiddle.net/4yesgn7b
不潔な

43

誰かがオプションの小数点以下2桁の数値のみを許可する正規表現を探している場合

^\d*(\.\d{0,2})?$

例として、以下の解決策はかなり信頼できることがわかりました

HTML:

<input name="my_field" pattern="^\d*(\.\d{0,2})?$" />

JS / JQuery:

$(document).on('keydown', 'input[pattern]', function(e){
  var input = $(this);
  var oldVal = input.val();
  var regex = new RegExp(input.attr('pattern'), 'g');

  setTimeout(function(){
    var newVal = input.val();
    if(!regex.test(newVal)){
      input.val(oldVal); 
    }
  }, 0);
});

2
setTimeout()を使用する目的は何ですか?
デレク

2
@デレク。私はそれが正規表現であると想定しています。テストはDOMをブロックしません。これを調べてください:developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop
christo8989

2
@Derek setTimeout()は、keydownイベントが完了するのを待ってから設定することを前提としてnewValいます(それ以外の場合は、と同じになりますoldVal)。ただし、タイムアウトが0の場合、(Firefoxでは)両方の値が同じになることが多いため、タイムアウトは無意味で機能しません。たとえば、1に設定すると、正常に動作します。
alstr

つまり、「承認されていない編集によって回答のフォーマット品質が低下する」という理由で、私の編集を2つの異なる投稿にロールバックしました。私の編集がどのように承認されないのか、それが正確に回答の品質をどのように低下​​させるのか説明していただけますか?(IMO、投稿から直接コードを実行でき、JSFiddleに移動する必要がないため、IMOによって改善されます)。
2

21

通貨については、次のことをお勧めします。

<div><label>Amount $
    <input type="number" placeholder="0.00" required name="price" min="0" value="0" step="0.01" title="Currency" pattern="^\d+(?:\.\d{1,2})?$" onblur="
this.parentNode.parentNode.style.backgroundColor=/^\d+(?:\.\d{1,2})?$/.test(this.value)?'inherit':'red'
"></label></div>

http://jsfiddle.net/vx3axsk5/1/を参照してください

HTML5プロパティの「step」、「min」、「pattern」は、フォームが送信されるときに検証され、onblurではありません。あなたは必要としないstepあなたが持っている場合pattern、あなたは必要としないpatternあなたが持っている場合step。したがってstep="any"、パターンはとにかくそれを検証するので、私のコードで元に戻すことができます。

onblurを検証したい場合は、ユーザーに視覚的な手がかりを与えることも、背景を赤く塗るのに役立つと思います。ユーザーのブラウザがサポートしtype="number"ていない場合は、にフォールバックしtype="text"ます。ユーザーのブラウザーがHTML5パターン検証をサポートしていない場合、私のJavaScriptスニペットはフォームの送信を妨げませんが、視覚的な手掛かりを与えます。したがって、HTML5のサポートが不十分な人や、JavaScriptを無効にしたり、HTTPリクエストを偽造したりしてデータベースにハッキングしようとする人にとっては、とにかくサーバーでもう一度検証する必要があります。フロントエンドでの検証のポイントは、ユーザーエクスペリエンスの向上です。したがって、ほとんどのユーザーが優れたエクスペリエンスを持っている限り、コードが引き続き機能し、バックエンドで検証できる場合は、HTML5機能に依存しても問題ありません。


2
よるMDNpattern動作しませんinput type=number<input type="number"> elements do not support use of the pattern attribute for making entered values conform to a specific regex pattern. The rationale for this is that number inputs can't contain anything except numbers, and you can constrain the minimum and maximum number of valid digits using the min and max attributes, as explained above.
izogfif

@izogfif良いメモ。また、実際には両方は必要ないことに注意し、ステップ、パターン、オンブラーの3つの方法を提供したことに注意してください。当時の私の理論的根拠は、ブラウザが何らかの理由で片方を窒息させた場合、もう片方がそうであるというものでした。フロントエンドの検証について、最近のステップに依存しても安全でしょう。
Ultimater

16

ステップ1: HTML番号入力ボックスをonchangeイベントにフックする

myHTMLNumberInput.onchange = setTwoNumberDecimal;

またはHTMLコード内

<input type="number" onchange="setTwoNumberDecimal" min="0" max="10" step="0.25" value="0.00" />

ステップ2:setTwoDecimalPlaceメソッドを記述する

function setTwoNumberDecimal(event) {
    this.value = parseFloat(this.value).toFixed(2);
}

toFixed()メソッドに渡される値を変えることにより、小数点以下の桁数を変更できます。MDN docsを参照してください。

toFixed(2); // 2 decimal places
toFixed(4); // 4 decimal places
toFixed(0); // integer

3
parseFloat(parseFloat(this.value).toFixed(2)); 10進数または数値型が必要な場合は、デフォルトでtoFixed()メソッドが文字列を返すため、parseFloat()で全体をラップできます。
spacedev 2018

6

jQueryを使用することが私の最善の解決策であることがわかりました。

$( "#my_number_field" ).blur(function() {
    this.value = parseFloat(this.value).toFixed(2);
});

6

入力タイプで小数点以下2桁のみを許可するには、これを試してください

<input type="number" step="0.01" class="form-control"  />

または、@ SamohtVIIの提案に従ってjQueryを使用します

$( "#ELEMENTID" ).blur(function() {
    this.value = parseFloat(this.value).toFixed(2);
});

21
これにより、Chrome 57で小数が2桁に制限されません
mintedsky

1
これは正しくありません。stepは、クリックまたは押し上げたときに何が起こるかを制御するだけで、何も制限しません。
Ini

ステップはまた1.000のような数が入力されるのを防ぎます。
Zapnologica 2018年

-2

このコードを使用

<input type="number" step="0.01" name="amount" placeholder="0.00">

デフォルトでは、HTML5入力要素のステップ値はstep = "1"です。


-4

書くだけ

<input type="number" step="0.1" lang="nb">

lang = 'nb "を使用すると、10進数をコンマまたはピリオドで記述できます


「lang = 'nb'カンマまたはピリオドで10進数を書くことができます」他のことについて話すことはできませんが、それは私にとってChromeでは機能しません。
Andrew Dinmore

-9

入力時:

step="any"
class="two-decimals"

スクリプト上:

$(".two-decimals").change(function(){
  this.value = parseFloat(this.value).toFixed(2);
});

5
投稿でスラーを使用しないでください。素敵である
James
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.