อนุญาตให้มีทศนิยม 2 ตำแหน่งใน <input type =“ number”>


222

ฉันมี<input type="number">และฉันต้องการที่จะ จำกัด การป้อนข้อมูลของผู้ใช้ให้เป็นตัวเลขหรือตัวเลขโดยมีทศนิยมสูงสุด 2 ตำแหน่ง

โดยทั่วไปฉันขอราคาป้อน

ฉันต้องการหลีกเลี่ยงการทำ regex มีวิธีทำหรือไม่?

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

2
type = "number" ไม่มีการรองรับเบราว์เซอร์ที่หลากหลาย มันจะดีกว่าเพียงแค่ใช้กล่องข้อความที่มีจาวาสคริปต์เพื่อให้แน่ใจว่าคุณได้รับอินพุตที่ต้องการ
www139

6
ใช่ แต่อินพุตกลับไปยังtype="text"ไงล่ะมันมีความสำคัญอย่างไร?
Ultimater

มีความเป็นไปได้ที่ซ้ำกันของประเภทอินพุตแบบลอยใน HTML5 หรือไม่
OhadR

/^\d+\.\d{2,2}$/ ทำงานให้ฉันเพื่อต้องการ 0.00
ZStoneDPM

คำตอบ:


336

แทนที่จะใช้step="any"ซึ่งอนุญาตให้ใช้จำนวนทศนิยมใด ๆ ให้ใช้step=".01"ซึ่งอนุญาตได้สูงสุดสองตำแหน่ง

รายละเอียดเพิ่มเติมในข้อมูลจำเพาะ: https://www.w3.org/TR/html/sec-forms.html#the-step-attribute


38
นี่ไม่ใช่คำตอบที่ถูกต้อง ขั้นตอนควบคุมเฉพาะสิ่งที่เกิดขึ้นเมื่อคุณคลิกหรือกดและจะไม่ จำกัด อะไร
Ini

1
@Michael_B โดยไม่คำนึงถึงสิ่งที่สเป็คหวังนี่เป็นเรื่องง่ายที่จะทดสอบ: jsfiddle.net/9hvm0b5uยังคงอนุญาตให้ป้อนได้มากกว่า 2 ทศนิยม ขั้นตอนจะควบคุมเฉพาะสิ่งที่ปุ่ม +/- เลื่อนจำนวนตาม (Chrome)
นาธาน

3
@Michael_B ผู้ใช้ไม่ได้ป้องกันการพิมพ์ตัวเลขเช่น500.12345ในอินพุตใด ๆ บางทีความเข้าใจของเราเกี่ยวกับข้อกำหนดนั้นแตกต่างกัน
นาธาน

3
ควรสังเกตว่าในขณะที่ผู้ใช้อาจพิมพ์ตัวเลขจำนวนเท่าใดก็ได้หลังจากตำแหน่งทศนิยมเบราว์เซอร์ส่วนใหญ่จะไม่อนุญาตให้ส่งแบบฟอร์มด้วยค่าที่ไม่ถูกต้องและตัวเลือก CSS :validและ:invalidนำไปใช้ตามที่คาดไว้
Andrew Dinmore

1
@ นาธานมันก็สำคัญที่จะทดสอบการตรวจสอบเบราว์เซอร์ ลองส่งค่าที่มีทศนิยมมากกว่า 2 ตำแหน่ง: jsfiddle.net/4yesgn7b
imclean

43

หากกรณีที่ทุกคนกำลังมองหา regex ที่อนุญาตเฉพาะตัวเลขที่มีทศนิยม 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 () คืออะไร?
Derek

2
@Derek ฉันถือว่ามันเป็น regex.test ไม่ได้บล็อค DOM ค้นหาสิ่งนี้: developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop
christo8989

2
@Derek ฉันสามารถสันนิษฐานได้ว่าsetTimeout()จะรอให้keydownกิจกรรมเสร็จสมบูรณ์ก่อนที่จะตั้งค่าnewVal(ไม่เช่นนั้นจะเหมือนกับoldVal) อย่างไรก็ตามด้วยการหมดเวลา 0 มันไม่มีจุดหมายและไม่ทำงานเนื่องจากค่าทั้งสองมักจะเหมือนกัน (ใน Firefox) หากคุณตั้งค่าเป็น 1 มันจะทำงานได้ดี
alstr

ดังนั้นคุณย้อนกลับการแก้ไขของฉันในสองโพสต์ที่แตกต่างกันด้วยเหตุผล "คุณภาพการจัดรูปแบบของคำตอบที่ไม่ผ่านการอนุมัติทำให้เสื่อมเสีย" คุณช่วยอธิบายการแก้ไขของฉันไม่ได้รับการอนุมัติได้อย่างไรและมันลดคุณภาพของคำตอบได้อย่างไร (IMO ปรับปรุงให้ดีขึ้นเนื่องจากผู้คนสามารถเรียกใช้รหัสโดยตรงจากโพสต์และพวกเขาไม่จำเป็นต้องไปที่ JSFiddle)
ดับเบิ้ล

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ถ้าคุณมีpatternและคุณไม่จำเป็นต้องมีถ้าคุณมีpattern stepดังนั้นคุณสามารถย้อนกลับstep="any"ด้วยรหัสของฉันได้เนื่องจากรูปแบบจะตรวจสอบความถูกต้องแล้ว

หากคุณต้องการตรวจสอบความถูกต้องของ onblur ฉันเชื่อว่าการให้คิวผู้ใช้ด้วยภาพนั้นมีประโยชน์เช่นกันเมื่อระบายสีพื้นหลังสีแดง หากเบราว์เซอร์ของผู้ใช้ไม่สนับสนุนtype="number"ก็จะ fallback type="text"ไป หากเบราว์เซอร์ของผู้ใช้ไม่สนับสนุนการตรวจสอบรูปแบบ HTML5 ข้อมูลโค้ด JavaScript ของฉันไม่ได้ป้องกันไม่ให้ส่งแบบฟอร์ม แต่จะให้คิวแบบภาพ ดังนั้นสำหรับผู้ที่มีการสนับสนุน HTML5 ต่ำและผู้ที่พยายามแฮ็คเข้าสู่ฐานข้อมูลโดยปิดการใช้งาน JavaScript หรือการปลอมคำขอ HTTP คุณจะต้องตรวจสอบความถูกต้องบนเซิร์ฟเวอร์อีกครั้ง จุดที่มีการตรวจสอบความถูกต้องของ front-end นั้นเพื่อประสบการณ์การใช้งานที่ดียิ่งขึ้น ดังนั้นตราบใดที่ผู้ใช้ส่วนใหญ่ของคุณมีประสบการณ์ที่ดีมันก็ดีที่จะต้องพึ่งพาคุณสมบัติของ HTML5 หากรหัสยังใช้งานได้และคุณสามารถตรวจสอบความถูกต้องของแบ็คเอนด์


2
ตามMDN , patternไม่ทำงานสำหรับ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 บันทึกที่ดี โปรดทราบว่าฉันสังเกตเห็นว่าคุณไม่จำเป็นต้องใช้ทั้งสองและมีสามวิธี: ขั้นตอนรูปแบบและ onblur เหตุผลของฉันในเวลานั้นคือถ้าเบราว์เซอร์สำลักที่หนึ่งด้วยเหตุผลบางอย่างมันมีอื่น ๆ อาจปลอดภัยที่จะพึ่งพาขั้นตอนเหล่านี้สำหรับการตรวจสอบส่วนหน้า
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

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

3
parseFloat (parseFloat (this.value) .toFixed (2)); ถ้าคุณต้องการทศนิยมหรือประเภทตัวเลขคุณสามารถล้อมสิ่งทั้งปวงใน parseFloat () ตามค่าเริ่มต้น toFixed () วิธีการส่งกลับสตริง
spacedev

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

หรือใช้ jQuery ตามที่แนะนำโดย @SamohtVII

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

21
สิ่งนี้ไม่ได้ จำกัด ตำแหน่งทศนิยมไว้ที่ 2 แห่งใน Chrome 57
mintedsky

1
สิ่งนี้ไม่ถูกต้อง ขั้นตอนควบคุมเฉพาะสิ่งที่เกิดขึ้นเมื่อคุณคลิกหรือกดและจะไม่ จำกัด อะไร
Ini

ขั้นตอนยังป้องกันไม่ให้มีการป้อนหมายเลขอย่างเช่น 1.000
Zapnologica

-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 "ให้คุณเขียนตัวเลขทศนิยมด้วยเครื่องหมายจุลภาคหรือจุด


"lang = 'nb' ให้คุณเขียนเลขทศนิยมด้วยเครื่องหมายจุลภาคหรือจุด" ไม่สามารถพูดอะไรก็ได้ แต่นั่นใช้ไม่ได้กับ Chrome สำหรับฉัน
Andrew Dinmore

-9

บนอินพุต:

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

ในสคริปต์:

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

5
โปรดหลีกเลี่ยงการใช้ slurs ในโพสต์ของคุณ และอย่าลืมเป็นคนดี
James
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.