มีประเภทอินพุตแบบลอยใน HTML5 หรือไม่


816

จากhtml5.orgแอตทริบิวต์ "value" ของประเภทอินพุตหากระบุและไม่ว่างต้องมีค่าที่เป็นเลขทศนิยมที่ถูกต้อง

กระนั้นก็เป็นเพียงแค่ (ใน Chrome เวอร์ชันล่าสุด), การควบคุม "updown" ด้วยจำนวนเต็มไม่ใช่ลอยตัว:

<input type="number" id="totalAmt"></input>

มีองค์ประกอบอินพุตแบบ floating point ที่เป็นพื้นฐานของ HTML5 หรือวิธีการทำให้ชนิดอินพุตตัวเลขทำงานกับการลอยได้ไม่ใช่ ints หรือไม่? หรือฉันต้องหันไปใช้ปลั๊กอิน jQuery UI?

คำตอบ:


1660

numberประเภทมีstepมูลค่าการควบคุมซึ่งตัวเลขที่ถูกต้อง (พร้อมด้วยmaxและmin) 1ซึ่งเริ่มต้นที่ ค่านี้ยังใช้โดยการใช้งานสำหรับปุ่ม stepper (เช่นการกดขึ้นเพื่อเพิ่มstep)

เพียงแค่เปลี่ยนค่านี้เป็นสิ่งที่เหมาะสม สำหรับเงินคาดว่าจะมีทศนิยมสองตำแหน่ง:

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

(ฉันจะตั้งค่าmin=0ถ้ามันเป็นค่าบวกเท่านั้น)

หากคุณต้องการอนุญาตให้มีจำนวนทศนิยมใด ๆ คุณสามารถใช้step="any"(แต่สำหรับสกุลเงินฉันขอแนะนำให้ใช้0.01) ใน Chrome และ Firefox, ปุ่ม stepper จะเพิ่มขึ้น / ลดลงโดยที่ 1 anyเมื่อใช้ (ขอบคุณคำตอบของมิคาลสเตฟานอว์สำหรับการชี้anyและดูข้อมูลจำเพาะที่เกี่ยวข้องที่นี่ )

นี่คือสนามเด็กเล่นที่แสดงว่าขั้นตอนต่าง ๆ มีผลต่ออินพุตประเภทต่างๆอย่างไร:

<form>
  <input type=number step=1 /> Step 1 (default)<br />
  <input type=number step=0.01 /> Step 0.01<br />
  <input type=number step=any /> Step any<br />
  <input type=range step=20 /> Step 20<br />
  <input type=datetime-local step=60 /> Step 60 (default)<br />
  <input type=datetime-local step=1 /> Step 1<br />
  <input type=datetime-local step=any /> Step any<br />
  <input type=datetime-local step=0.001 /> Step 0.001<br />
  <input type=datetime-local step=3600 /> Step 3600 (1 hour)<br />
  <input type=datetime-local step=86400 /> Step 86400 (1 day)<br />
  <input type=datetime-local step=70 /> Step 70 (1 min, 10 sec)<br />
</form>


ตามปกติฉันจะเพิ่มบันทึกย่อ: จำไว้ว่าการตรวจสอบฝั่งไคลเอ็นต์เป็นเพียงความสะดวกสบายให้กับผู้ใช้ คุณต้องตรวจสอบด้านเซิร์ฟเวอร์!


1
หากต้องการตอบกลับการแก้ไขของ @ Elfayer: เครื่องหมายคำพูดเป็นตัวเลือกใน HTML เว้นแต่คุณต้องการใช้อักขระบางตัว โดยส่วนตัวฉันชอบที่จะละเว้นพวกเขาหากเป็นไปได้เพื่อให้อ่านง่ายขึ้น
เดฟ

5
สิ่งนี้ทำงานไม่ถูกต้องใน Firefox เวอร์ชันล่าสุด: bugzilla.mozilla.org/show_bug.cgi?id=1003896
trpt4him

7
@Dave: ใช่เทคนิคการละเว้นคำพูดเป็นสิ่งที่ดีบิตมันแนะนำโฮสต์ของปัญหาที่อาจเกิดขึ้น ขั้นแรกให้มีการจัดการอักขระย่อยในเบราว์เซอร์และเวอร์ชันต่างกัน หากคุณเลือกที่จะไม่ใช้เครื่องหมายคำพูดคุณจะต้องรับรู้อย่างต่อเนื่องว่าอักขระใดที่จะทำให้เกิดปัญหาในแต่ละเบราว์เซอร์และแต่ละเวอร์ชัน นั่นคือพลังจิตมากมายที่อุทิศให้กับบางสิ่งที่ไม่จำเป็นต้องกังวลเลยถ้าคุณใช้คำพูด (ต่อ)
Chris Pratt

9
ข้อที่สองในขณะที่คุณอาจกังวลเกี่ยวกับกฎของตัวละครที่ไม่ดีนัก แต่นักพัฒนาที่อยู่ข้างหลังคุณอาจจะไม่ใช่ จากนั้นกำหนดให้พวกเขาต้องทนงานที่ยากลำบากในการเพิ่มเครื่องหมายคำพูดลงในแอตทริบิวต์ทั้งหมดที่คุณปล่อยไว้โดยไม่มีการอ้างถึงหรือแย่กว่านั้นเพียงแค่แนะนำปัญหาในรหัสที่พวกเขาอาจไม่เข้าใจแหล่งที่มาของ ในที่สุดเนื่องจากบางครั้งคุณจะต้องใช้อัญประกาศรหัสจึงดูไม่สอดคล้องกับคุณลักษณะบางอย่างที่ยกมาและอื่น ๆ ไม่ได้
Chris Pratt

2
@relipse ดูที่นี่: stackoverflow.com/q/3790935/1180785แต่อย่าลืมอ่านความคิดเห็นของแต่ละคำตอบ ดูเหมือนว่าตัวเลือกทั้งหมดจะมีข้อเสียและคุณจะต้องเห็นสิ่งที่เหมาะกับความต้องการเฉพาะของคุณ
เดฟ

153

Via: http://blog.isotoma.com/2012/03/html5-input-typenumber-and-decimalsfloats-in-chrome/

แต่ถ้าคุณต้องการให้ตัวเลขทั้งหมดถูกต้องเป็นจำนวนเต็มและทศนิยม ในกรณีนี้ตั้งค่าขั้นตอนเป็น "ใด ๆ "

<input type="number" step="any" />

ใช้งานได้สำหรับฉันใน Chrome ไม่ได้ทดสอบในเบราว์เซอร์อื่น


4
Chrome => ทำงานได้อย่างสมบูรณ์แบบ Safari => จะไม่แสดงข้อความแสดงข้อผิดพลาดและหากไม่ใช่ตัวเลขจะไม่ส่งไปยังเซิร์ฟเวอร์ IE => เวอร์ชันที่น้อยกว่า 10 ไม่ทำงาน
Abhi

4
น่าเสียดายที่ chrome ช่วยให้คุณป้อนทศนิยมหลายตำแหน่งเช่นที่อยู่ IP
Andy


12

คุณสามารถใช้แอ็ตทริบิวต์ step กับหมายเลขชนิดอินพุต:

<input type="number" id="totalAmt" step="0.1"></input>

step="any"จะอนุญาตให้ใช้ทศนิยมใด ๆ
step="1"จะไม่อนุญาตให้ใช้ทศนิยม
step="0.5"จะอนุญาต 0.5 1; 1.5; ...
step="0.1"จะอนุญาตให้ 0.1; 0.2; 0.3; 0.4; ...


8

ตามคำตอบนี้

<input type="text" id="sno" placeholder="Only float with dot !"   
   onkeypress="return (event.charCode >= 48 && event.charCode <= 57) ||  
   event.charCode == 46 || event.charCode == 0 ">

ความหมาย:

รหัส Char:

  • 48-57 เท่ากับ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
  • 0 คือBackspace(ไม่จำเป็นต้องรีเฟรชหน้าใน Firefox)
  • 46 คือ dot

&&เป็นAND, ||เป็นORผู้ประกอบการ

ถ้าคุณลองลอยด้วยเครื่องหมายจุลภาค:

<input type="text" id="sno" placeholder="Only float with comma !"   
     onkeypress="return (event.charCode >= 48 && event.charCode <= 57) ||  
     event.charCode == 44 || event.charCode == 0 ">

สนับสนุน Chromium และ Firefox (Linux X64) (เบราว์เซอร์อื่น ๆ ที่ฉันไม่มีอยู่)


รู้สึกย้อนกลับ วิธีการเกี่ยวกับการคัดลอกและวางในช่อง?
Mars Robertson


4
การแฮ็กสำหรับการป้อนข้อมูลการแฮ็กสำหรับการคัดลอกและวางการแฮ็กที่อยู่ด้านบนของการแฮ็ก = การปฏิบัติที่ไม่ดี เรามี 2017
Mars Robertson

คุณอ่านรหัสผ่านที่ใด? ใครสนใจว่าวิธีการใช้งานหลังเซสชั่นใด ไม่เรามี 1856! ลองผู้ใช้รายอื่น!
dsgdfg

ฟังดูซับซ้อนเกินไป แต่ให้เหตุผลเกี่ยวกับวิธีการนี้กับสิ่งอื่น ๆ ที่ไม่ได้ระบุไว้
WebDude0482

6

ฉันทำเช่นนั้น

 <input id="relacionac" name="relacionac" type="number" min="0.4" max="0.7" placeholder="0,40-0,70" class="form-control input-md" step="0.01">

จากนั้นฉันนิยาม min เป็น 0.4 และ max ใน 0.7 ด้วยขั้นตอน 0.01: 0.4, 0.41, 0,42 ... 0.7


4

ฉันเพิ่งมีปัญหาเดียวกันและฉันจะแก้ไขได้โดยเพียงแค่การใส่เครื่องหมายจุลภาคและไม่ได้เป็นระยะเวลา / หยุดเต็มจำนวนเพราะการแปลภาษาฝรั่งเศส

ดังนั้นจึงใช้งานได้กับ:

2 ก็โอเค

2,5 ก็โอเค

2.5 คือ KO (จำนวนถือว่าผิดกฎหมายและคุณได้รับค่าว่าง)


3
เพิ่ม lang = "en" เพื่อป้อนข้อมูลหรือผู้ปกครองใด ๆ และมันจะเริ่มใช้รูปแบบตัวเลขภาษาอังกฤษ
user1040495
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.