Cho phép 2 vị trí thập phân trong <kiểu đầu vào = Số thứ tự>


221

Tôi có một <input type="number">và tôi muốn hạn chế đầu vào của người dùng hoàn toàn là số hoặc số có số thập phân lên đến 2 chữ số thập phân.

Về cơ bản, tôi đang yêu cầu một đầu vào giá.

Tôi muốn tránh làm regex. Có cách nào để làm điều đó?

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

2
loại = "số" không có hỗ trợ trình duyệt rộng. Tốt hơn là chỉ sử dụng một hộp văn bản với một số javascript để đảm bảo rằng bạn nhận được đầu vào mong muốn.
www139

6
Vâng, nhưng đầu vào rơi trở lại type="text"dù sao, vậy nó có vấn đề gì?
Ultimater


/^\d+\.\d{2,2}$/ làm việc cho tôi để yêu cầu 0.00
ZStoneDPM

Câu trả lời:


333

Thay vì step="any", cho phép bất kỳ số lượng vị trí thập phân, sử dụng step=".01", cho phép tối đa hai vị trí thập phân.

Thêm chi tiết trong thông số: https://www.w3.org/TR/html/sec-forms.html#the-step-attribution


38
Đây không phải là câu trả lời chính xác. Bước chỉ chi phối những gì xảy ra khi bạn nhấp hoặc nhấn lên và nó không hạn chế bất cứ điều gì.
Ini

1
@Michael_B bất kể thông số kỹ thuật hy vọng là gì, điều này khá đơn giản để kiểm tra: jsfiddle.net/9hvm0b5u vẫn cho phép nhập hơn 2 số thập phân. Các bước chỉ chi phối những gì các nút +/- di chuyển số lượng theo. (Chrome)
Nathan

3
@Michael_B người dùng không bị cấm nhập một số như 500.12345trong bất kỳ đầu vào nào, có lẽ sự hiểu biết của chúng tôi về các yêu cầu là khác nhau.
Nathan

3
Cần lưu ý rằng, mặc dù người dùng có thể nhập bất kỳ số chữ số nào sau vị trí thập phân, hầu hết các trình duyệt sẽ không cho phép gửi biểu mẫu có giá trị không hợp lệ và các bộ chọn CSS :valid:invalidđược áp dụng như mong đợi.
Andrew Dinmore

1
@Nathan, nó cũng không quan trọng để kiểm tra xác thực trình duyệt. Hãy thử gửi một giá trị với hơn 2 vị trí thập phân: jsfiddle.net/4yesgn7b
imclean

43

Nếu trường hợp bất cứ ai đang tìm kiếm một regex chỉ cho phép các số có 2 chữ số thập phân tùy chọn

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

Ví dụ, tôi đã tìm thấy giải pháp dưới đây khá đáng tin cậy

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
Mục đích của việc có setTimeout () là gì?
Derek

2
@Derek. Tôi giả sử nó vì vậy regex.test không chặn DOM. Tra cứu cái này: developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop
christo8989

2
@Derek Tôi chỉ có thể giả sử setTimeout()là chờ keydownsự kiện hoàn thành trước khi cài đặt newVal(nếu không nó sẽ giống như oldVal). Tuy nhiên, với thời gian chờ là 0, điều đó là vô nghĩa và không hoạt động vì cả hai giá trị thường giống nhau (trong Firefox). Nếu bạn đặt nó thành 1, chẳng hạn, nó hoạt động tốt.
alstr

Vì vậy, bạn đã quay lại chỉnh sửa của tôi trong hai bài đăng khác nhau với lý do "chỉnh sửa không được phê duyệt làm giảm chất lượng định dạng của câu trả lời". Bạn có thể giải thích cách chỉnh sửa của tôi không được chấp thuận và chính xác nó làm giảm chất lượng câu trả lời như thế nào không? (IMO, nó cải thiện nó, vì mọi người có thể chạy mã trực tiếp từ bài đăng và họ không cần phải truy cập vào JSFiddle).
tiếng bíp đôi

21

Đối với tiền tệ, tôi muốn đề xuất:

<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>

Xem http://jsfiddle.net/vx3axsk5/1/

Các thuộc tính HTML5 "bước", "min" và "mẫu" sẽ được xác thực khi biểu mẫu được gửi, không phải onblur. Bạn không cần stepnếu bạn có patternvà bạn không cần patternnếu bạn có step. Vì vậy, bạn có thể trở lại step="any"với mã của tôi vì mẫu sẽ xác nhận nó bằng mọi cách.

Nếu bạn muốn xác thực onblur, tôi tin rằng việc cung cấp cho người dùng một dấu hiệu trực quan cũng hữu ích như tô màu nền đỏ. Nếu trình duyệt của người dùng không hỗ trợ, type="number"nó sẽ dự phòng type="text". Nếu trình duyệt của người dùng không hỗ trợ xác thực mẫu HTML5, đoạn mã JavaScript của tôi sẽ không ngăn biểu mẫu gửi, nhưng nó đưa ra một dấu hiệu trực quan. Vì vậy, đối với những người có hỗ trợ HTML5 kém và những người đang cố gắng xâm nhập vào cơ sở dữ liệu bằng JavaScript bị vô hiệu hóa hoặc giả mạo các Yêu cầu HTTP, bạn cần phải xác thực lại trên máy chủ bằng mọi cách. Điểm có xác nhận ở mặt trước là cho trải nghiệm người dùng tốt hơn. Vì vậy, miễn là hầu hết người dùng của bạn có trải nghiệm tốt, thật tốt khi dựa vào các tính năng HTML5 với điều kiện mã sẽ vẫn hoạt động và bạn có thể xác thực ở mặt sau.


2
Theo MDN , patternkhông hoạt động cho 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 15/03/18

@izogfif Lưu ý tốt. Cũng lưu ý tôi thực sự lưu ý rằng bạn không cần cả hai và cung cấp ba cách: Bước, mô hình và onblur. Lý do của tôi tại thời điểm đó là nếu một trình duyệt bị sặc một cái vì một lý do nào đó nó có cái kia. Có lẽ an toàn để dựa vào bước ngày nay để xác nhận frontend.
Ultimater

16

Bước 1: Nối hộp nhập số HTML của bạn vào một sự kiện trao đổi

myHTMLNumberInput.onchange = setTwoNumberDecimal;

hoặc trong mã HTML

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

Bước 2: Viết setTwoDecimalPlacephương thức

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

Bạn có thể thay đổi số lượng vị trí thập phân bằng cách thay đổi giá trị được truyền vào toFixed()phương thức. Xem tài liệu MDN .

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

3
parseFloat (parseFloat (this.value) .toFixed (2)); Nếu bạn muốn kiểu thập phân hoặc số, bạn có thể gói toàn bộ thứ trong parseFloat () theo mặc định phương thức toFixed () trả về chuỗi.
spacesev

6

Tôi thấy sử dụng jQuery là giải pháp tốt nhất của tôi.

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

6

Hãy thử điều này để chỉ cho phép 2 số thập phân trong loại đầu vào

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

Hoặc Sử dụng jQuery theo đề xuất của @SamohtVII

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

21
Điều này không giới hạn số thập phân ở 2 vị trí trong Chrome 57
mintedsky

1
Điều này LAF không đúng. Bước chỉ chi phối những gì xảy ra khi bạn nhấp hoặc nhấn lên và nó không hạn chế bất cứ điều gì.
Ini

Bước cũng ngăn số như 1.000 được nhập.
Zapnologica

-2

Sử dụng mã này

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

Theo mặc định Giá trị bước cho các yếu tố đầu vào HTML5 là step = "1".


-4

chỉ viết

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

lang = 'nb "cho phép bạn viết số thập phân của mình bằng dấu phẩy hoặc dấu chấm


"lang = 'nb' cho phép bạn viết các số thập phân của mình bằng dấu phẩy hoặc dấu chấm" Không thể nói bất cứ điều gì khác, nhưng điều đó không hoạt động trong Chrome đối với tôi.
Andrew Dinmore

-9

Về đầu vào:

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

Trên kịch bản:

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

5
Xin vui lòng tránh sử dụng slurs trong bài viết của bạn. Và hãy nhớ là tốt đẹp
James
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.