在<input type =“ number”>中允许2个小数位


221

我有一个<input type="number">,我想将用户的输入限制为纯数字或带小数的数字(最多2个小数位)。

基本上,我要输入价格。

我想避免做正则表达式。有办法吗?

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

2
type =“ number”没有广泛的浏览器支持。最好只使用带有一些JavaScript的文本框,以确保获得所需的输入。
www139 2015年

6
是的,但是type="text"无论如何投入还是会回落,那有什么关系呢?
Ultimater


/^\d+\.\d{2,2}$/使我需要0.00
ZStoneDPM,

Answers:


333

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

3
@Michael_B不会阻止用户键入500.12345任何输入中的数字,也许我们对要求的理解是不同的。
弥敦道

3
应该注意的是,尽管用户可以在小数点后输入任意位数,但是大多数浏览器将不允许提交带有无效值的表单和CSS选择器,:valid并且:invalid会按预期应用。
Andrew Dinmore

1
@Nathan,测试浏览器验证也很简单。尝试提交一个多于2个小数位的值:jsfiddle.net/4yesgn7b
imclean

43

如果情况是有人在寻找正则表达式,该正则表达式只允许数字带有可选的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()的目的是什么?
德里克

2
@Derek。我以为是regex.test不会阻止DOM。查找以下内容:developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop
christo8989

2
@Derek我只能假定setTimeout()is是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/

当提交表单而不是onblur时,将验证HTML5属性“ step”,“ min”和“ pattern”。你并不需要step,如果你有一个pattern,你不需要pattern,如果你有一个step。因此,您可以step="any"使用我的代码,因为该模式无论如何都会对其进行验证。

如果您想验证onblur,我相信为用户提供视觉提示也可以帮助您将背景变成红色。如果用户的浏览器不支持type="number",则会回退到type="text"。如果用户的浏览器不支持HTML5模式验证,那么我的JavaScript代码段不会阻止表单提交,但会给出视觉提示。因此,对于HTML5支持不佳的人,以及试图在禁用JavaScript或伪造HTTP请求的情况下入侵数据库的人们,无论如何都需要在服务器上再次进行验证。在前端进行验证的目的是为了获得更好的用户体验。因此,只要您的大多数用户都拥有良好的使用经验,就可以依赖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"  />

或使用@SamohtVII建议的jQuery

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

21
这不会将小数位数在Chrome 57中限制为2个位
mintedsky

1
这是不正确的。步骤仅控制单击或按下时发生的情况,并不限制任何操作。
伊尼(Ini)

步骤还阻止输入数字1.000。
Zapnologica


-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
请避免在您的帖子中使用诽谤。记住要友善
James
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.