HTML5 中是否有浮点输入类型?

Is there a float input type in HTML5?

提问人:B. Clay Shannon-B. Crow Raven 提问时间:9/26/2013 最后编辑:JasperB. Clay Shannon-B. Crow Raven 更新时间:10/31/2022 访问量:1109240

问:

根据 html5.org,“number”输入类型的“value 属性,如果指定且不为空,则其值必须为有效的浮点数。

然而,它只是(无论如何,在最新版本的 Chrome 中)是一个带有整数的“updown”控件,而不是浮点数:

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

是否有 HTML5 原生的浮点输入元素,或者有一种方法可以使数字输入类型与浮点数而不是整数一起使用?还是我必须求助于jQuery UI插件?

HTML 输入 浮点

评论


答:

2387赞 Dave 9/26/2013 #1

该类型具有一个值,用于控制哪些数字有效(以及 和 ),该值默认为 。步进按钮的实现也使用此值(即按下 up 会增加 )。numberstepmaxmin1step

只需将此值更改为适当的值即可。对于钱,可能期望小数点后两位:

<label for="totalAmt">Total Amount</label>
<input type="number" step="0.01" id="totalAmt">

(如果它只能是正数,我也会设置)min=0

如果您希望允许任意数量的小数位,则可以使用(尽管对于货币,我建议坚持使用)。在 Chrome 和 Firefox 中,使用 时步进按钮将递增/递减 1。(感谢 Michal Stefanow 的回答指出,并在此处查看相关规范step="any"0.01anyany)

下面是一个 Playground,显示了各种步骤如何影响各种输入类型:

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


像往常一样,我将添加一个快速说明:请记住,客户端验证只是对用户的方便。您还必须在服务器端进行验证!

评论

2赞 Dave 4/2/2014
为了回应@Elfayer的编辑:引号在 HTML 中是可选的,除非你想使用某些字符。就我个人而言,我更喜欢尽可能省略它们以获得更好的可读性。
9赞 trpt4him 1/3/2015
这在最新版本的 Firefox 中无法正常工作:bugzilla.mozilla.org/show_bug.cgi?id=1003896
16赞 Chris Pratt 8/13/2015
@Dave:是的,从技术上讲,省略引号是可以的,但它会带来许多潜在的问题。首先,字符子集在不同的浏览器及其版本中以不同的方式处理。如果您选择不使用引号,那么您必须不断意识到哪些字符会导致每个浏览器和版本出现问题。这是大量的精神力量,如果你只使用引号,就完全没有必要担心。(续)
21赞 Chris Pratt 8/13/2015
其次,虽然你可能可以担心哪些角色是好的,哪些是不可以的,但你身后的开发人员可能不会。然后,这要求他们要么忍受艰巨的任务,即在你留下的所有未加引号的属性上添加引号,要么更糟的是,只是在代码中引入问题,他们甚至可能不理解问题的来源。最后,由于有时您必须使用引号,因此代码看起来与某些引用的属性不一致,而其他属性则不一致。
3赞 Dave 3/5/2016
@relipse在这里看到:stackoverflow.com/q/3790935/1180785 但请务必阅读每个答案的评论;看起来所有选项都有缺点,您需要看看什么适合您的特定需求。
205赞 Mars Robertson 7/24/2014 #2

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

但是,如果您希望所有数字都有效,整数和小数都有效怎么办?在这种情况下,将步骤设置为“any”

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

在 Chrome 中对我有用,未在其他浏览器中测试。

评论

6赞 Abhi 5/28/2015
Chrome => 完美工作 Safari => 不会显示错误消息,如果不是数字,则不会传递给服务器 IE => 版本低于 10 不工作
7赞 Andy 12/17/2015
不幸的是,在 chrome 中,它允许您输入多个小数点,例如 IP 地址。
1赞 andrecj 2/23/2021
@Andy较新版本的 Chrome 中,此问题已修复。这应该是当今公认的答案。
0赞 Sergey Ponomarev 7/21/2023
在FireFox中,它允许输入任何内容,但验证将失败。仍然认为这是最好的答案
7赞 Stephane 3/9/2016 #3

我只是遇到了同样的问题,由于法语本地化,我可以通过在数字中放置逗号而不是句/句号来解决它。

因此,它适用于:

2 没问题

2,5 是可以的

2.5 是 KO(该数字被视为“非法”,您会收到空值)。

评论

8赞 user1040495 2/17/2019
将 lang=“en” 添加到输入或任何父项,它将开始使用英文数字样式
33赞 alvarodoune 3/16/2016 #4

您可以使用:

<input type="number" step="any" min="0" max="100" value="22.33">
14赞 dsgdfg 4/14/2016 #5

基于这个答案

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

意义:

字符代码 :

  • 48-57 等于0, 1, 2, 3, 4, 5, 6, 7, 8, 9
  • 0 是(否则需要在 Firefox 上刷新页面)Backspace
  • 46 是dot

&&is , is 运算符。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)(其他浏览器不存在。

评论

1赞 Mars Robertson 1/16/2017
感觉落后。在字段中复制和粘贴怎么样?
6赞 Mars Robertson 1/17/2017
Hack 用于输入,Hack 用于复制和粘贴,hack on a hack = 糟糕的做法。我们有 2017
1赞 dsgdfg 1/18/2017
您在哪里读取任何密码输入?谁在乎会话后使用哪种方法?不,我们有 1856 年!尝试其他用户!
1赞 WebDude0482 2/27/2018
听起来太复杂了,但是,没有提供关于这种方法与提到的其他方法的推理
11赞 sadalsuud 6/13/2017 #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">

然后,我用 0.01 步长在 0.4 中定义最小值,在 0.7 中定义最大值:0.4、0.41、0,42 ...0.7

28赞 SanChamp 2/26/2018 #7

您可以将 step 属性用于输入类型编号:

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

step="any"将允许任何小数点。
不允许小数。
将允许 0.5;1;1.5;...
将允许 0.1;0.2;0.3;0.4;...
step="1"step="0.5"step="0.1"

10赞 Avatar 9/14/2020 #8

我已经开始使用它与智能手机完美配合:inputmode="decimal"

<input type="text" inputmode="decimal" value="1.5">

请注意,我们必须使用 而不是 .但是,在桌面上,它仍然允许字母作为值。type="text"number

对于桌面,您可以使用:

<input type="number" inputmode="decimal">

它允许 和 作为输入和仅数字。0-9.

请注意,某些国家/地区使用小数除法,该除法在 NumPad 上默认激活。因此,通过 Numpad 输入浮点数将不起作用,因为输入字段需要一个(在 Chrome 中)。这就是为什么如果您的网站上有国际用户,您应该使用的原因。,.type="text"


您可以在桌面(也使用小键盘)和手机上尝试此操作:

<p>Input with type text:</p>
<input type="text" inputmode="decimal" value="1.5">
<br>
<p>Input with type number:</p>
<input type="number" inputmode="decimal" value="1.5">


参考资料: https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/inputmode

7赞 Irfan wani 10/28/2020 #9
<input type="number" step="any">

这对我有用,我认为这是使输入字段接受任何十进制数的最简单方法,而不管小数部分有多长。 Step 属性实际上显示输入字段应该接受多少个小数点。 例如,step=“0.01” 将只接受两个小数点。

4赞 Ernst Plesiutschnig 12/10/2020 #10

在我的 iPad 上使用 React,对我来说并不完美。 对于介于 99.99999 - .00000 之间的浮点数,我使用正则表达式。对于所有没有浮点数的正两位数(例如 23),第一组为 true,或者对于第二组,例如 .12345。您可以将其用于任何正浮点数,只需更改范围或分别。type="number"(^[0-9]{0,2}$)|(^[0-9]{0,2}\.[0-9]{0,5}$)(...)|(...){0,2}{0,5}

<input
  className="center-align"
  type="text"
  pattern="(^[0-9]{0,2}$)|(^[0-9]{0,2}\.[0-9]{0,5}$)"
  step="any"
  maxlength="7"
  validate="true"
/>
4赞 Guenter 1/21/2021 #11

本主题(例如)与 stepMismatch 相关,所有浏览器都支持该主题,如下所示:step="0.01"enter image description here

10赞 Alexie01 4/18/2021 #12

是的,这是正确答案:

step="any"

这样效率更高。相信我。

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

document.getElementById('form1').addEventListener('submit', function(e){
e.preventDefault();
alert("Your nnumber is: "+document.getElementById('n1').value)
alert("This works no ? :) please upvote")
})
<form id="form1">
<input type="number" step="any" id="n1">
<button type="submit">Submit</button>
</form>
<!-- UPVOTE :)-->

2赞 MD SHAYON 9/18/2021 #13

如果任何方法不起作用,您可以使用 parse float。

const totalAmt = document.getElementById("totalAmt");


totalAmt.addEventListener("change", (e)=>{
      // e.preventDefault(e);
      const result = parseFloat(e.target.value);
     console.log(result)
});
<input type="text" id="totalAmt" />