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

1155
根据 html5.org 的说法,“number” 输入类型的 “value” 属性,如果指定且非空,必须具有有效的浮点数值。然而,在最新版本的 Chrome 中,它只是一个整数的“上下控件” ,并非浮点数。

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

HTML5中是否有原生的浮点数输入元素,或者有什么方法可以让数字输入类型使用浮点数而不是整数?还是我必须使用jQuery UI插件?

14个回答

2381

number类型有一个step值,控制哪些数字是有效的(与maxmin一起),默认为1。实现还使用此值来进行增量按钮的操作(即按向上按钮增加step)。

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

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

(如果它只能为正数,则我建议将min=0

如果您想允许任意数量的小数位数,可以使用 step="any"(尽管对于货币来说,我建议坚持0.01)。在Chrome和Firefox中,当使用any时,步进器按钮将增加/减少1。感谢Michal Stefanow的答案指出了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>

一如既往,我要补充一句话:记住,客户端验证只是为了方便用户。你还必须在服务器端进行验证!



2
回应 @Elfayer 的编辑:在 HTML 中,引号是可选的,除非您想使用某些特殊字符。个人而言,我更喜欢尽可能省略它们以获得更好的可读性。 - Dave
9
最新版本的Firefox中这个功能无法正常工作:https://bugzilla.mozilla.org/show_bug.cgi?id=1003896 - trpt4him
16
@Dave:是的,从技术上讲,省略引号是可以的,但这会引入一系列潜在问题。首先,在不同的浏览器和其版本中,一些字符会被处理得不同。如果你选择不使用引号,那么你必须时刻意识到每个浏览器和版本中哪些字符会引起问题。如果你只使用引号,就不必担心这些完全不必要的事情,不需要花费太多精力。 - Chris Pratt
21
其次,虽然您可能对于哪些字符可以使用,哪些不能使用的规则感到满意,但接替您的开发人员可能不会。这就需要他们耗费精力,在您未标引号的所有属性上添加引号,或者更糟糕的是,可能会在代码中引入问题,而他们甚至可能无法理解问题的根源。最后,由于有时您必须使用引号,所以代码看起来就会不一致,一些属性带引号,而其他属性则没有。 - Chris Pratt
3
请参考这里:https://dev59.com/pG865IYBdhLWcg3wfemU,但一定要阅读每个答案下面的评论;看起来所有的选项都有缺点,你需要确定哪种适合你的特定需求。 - Dave
显示剩余8条评论

205

6
Chrome => 完美运行 Safari => 不会显示错误消息,如果不是数字,则不会传递给服务器 IE => 低于版本10的不可用 - Abhi
7
很不幸,在Chrome浏览器中,你可以输入多个小数点,例如IP地址。 - Andy
1
@Andy 在较新的 Chrome 版本中,这个问题已经被修复了。现在应该接受这个答案。 - andrecj
在FireFox中,它允许输入任何内容,但验证将失败。仍然认为这是最好的答案。 - Sergey Ponomarev

33

你可以使用:

<input type="number" step="any" min="0" max="100" value="22.33">

28

您可以使用步骤属性来设置数字输入框的步进值:

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


14

基于这个答案

<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 是 Backspace(否则需要在 Firefox 上刷新页面)
  • 46 是

&&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
请在插入之前进行验证,使用此方法:使用JavaScript检测Ctrl + V和Ctrl + C @MichalStefanow - dsgdfg
6
输入方面的黑客、复制粘贴方面的黑客以及在一个黑客基础上进行修改等等都是不好的做法。我们已经进入了2017年。 - Mars Robertson
1
你在哪里读取任何密码输入?谁在乎会话后使用哪种方法?不,我们有1856个用户!请尝试另一个用户! - dsgdfg
1
听起来太复杂了,但是就这种方法与其他提到的方法进行推理并没有提供。 - WebDude0482
我添加了 || event.ctrlKey 以允许基本的复制粘贴。但如果这不是原型,我不会使用这种方法。 - yellowsir

11

我这样做

 <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.4,最大值为0.7,步长为0.01:0.4、0.41、0.42......0.7。


11

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


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

10

我已经开始使用 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"


您可以在桌面(包括使用NumPad)和手机上尝试这个功能:

<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/zh-CN/docs/Web/HTML/Global_attributes/inputmode 元素的 inputmode 全局属性,用于指定输入数据的类型。它可以帮助移动设备上的虚拟键盘优化输入体验,并帮助浏览器更好地自动完成表单。该属性接受一些特定的值,例如“text”,“decimal”等,具体取决于所需的输入类型。需要注意的是,每个浏览器支持的值可能不同,开发人员应该在使用之前确保跨浏览器兼容性。

10

是的,这是正确答案:

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


7
我曾遇到同样的问题,最后发现只需在数字中使用逗号而不是句号/ 句点。这是由于法国本地化的原因。 因此,以下数字格式可行: 2 可行 2,5 可行 2.5 不可行(该数字被视为“非法”,您将收到空值)。

8
将lang="en"添加到input或其父级中,它将开始使用英文数字风格。 - user1040495

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接