仅限正整数的HTML输入(Type=number)

47

尽管这方面有很多问题,但我无法找到正确的正则表达式模式。

我不希望用户能够输入或者键入任何内容。

<td><input type="number" pattern=" 0+\.[0-9]*[1-9][0-9]*$" name="itemConsumption" /></td>
  1. -1.0(负数)
  2. 字符串和任何字符
  3. 1.0(小数)
  4. 没有范围限制

我只想接受正整数。

SOLVED 不需要正则表达式,我不知道这个:D

<td><input type="number" pattern=" 0+\.[0-9]*[1-9][0-9]*$" name="itemConsumption" onkeypress="return event.charCode >= 48 && event.charCode <= 57"</td> 

1
我的建议是:<input type="text" pattern="[0-9]*" name="itemConsumption" />。请明确说明您想要允许的内容,这样会更容易理解。 - Wiktor Stribiżew
我认为你漏掉了一件事:pattern属性只能在提交时控制数据,而不能在用户输入时控制。 - Wiktor Stribiżew
@SCS:请给我们一些反馈,我们很想知道您是否解决了这个问题。 - Wiktor Stribiżew
@stribizhev 谢谢你的代码 <input type="text" name="itemConsumption" onkeypress="return event.charCode >= 48 && event.charCode <= 57" />。完美运行。 - SCS
在安卓机器上用Chrome无法工作。 - Adam
10个回答

65

要禁止除数字以外的任何输入,您可以使用

<input type="text" onkeypress="return (event.charCode == 8 || event.charCode == 0 || event.charCode == 13) ? null : event.charCode >= 48 && event.charCode <= 57" name="itemConsumption" />
                   ^------------....

<form id="mfrm">
<table>
    <tr>
        <td>Enter number only: <input type="text" name="itemConsumption" onkeypress="return (event.charCode == 8 || event.charCode == 0 || event.charCode == 13) ? null : event.charCode >= 48 && event.charCode <= 57" /></td>
        <td><input type="Submit"/></td>
    </tr>
</table>

这里的条件语句event.charCode == 8 || event.charCode == 0 || event.charCode == 13用于处理按下DELETE、BACKSPACE或ENTER键的情况(对于Firefox很重要,请参见下面的Mohit's comment和与启用ENTER键相关的datashaman's comment)。 event.charCode >= 48 && event.charCode <= 57表示只返回0(十进制代码为48)以及所有其他数字,直到9(十进制代码为57)。

如果添加了上述代码,则在Firefox中退格键和删除键无法正常工作。 - Mohit Adwani
2
@MohitAdwani:尝试这个更新onkeypress="return (event.charCode == 8 || event.charCode == 0) ? null : event.charCode >= 48 && event.charCode <= 57" - Wiktor Stribiżew
现在运行良好。我认为你应该更新你的答案。或者也许你发布的就是用户想要的。 - Mohit Adwani
1
你还应该将字符代码13添加到其中 - 否则当你在该字段中时,无法按Enter键提交表单。 - datashaman
3
这可以通过复制粘贴无效值来解决(或滥用)。 - Cerlancism
显示剩余2条评论

33
你可以使用 typeminoninput
<input type="number" min="0" step="1" oninput="validity.valid||(value='');">

<form>
<label>Input with positive numbers only</label><br/><br/>
<input type="number" min="0" step="1" oninput="validity.valid||(value='');">
</form>


最大值不起作用了? - Hrvoje
1
@Harvey,是的,最大值也可以使用,但这个例子仅适用于正数。 - Nikhil Mahirrao
这个解决方案对于这个问题确实有效(没有范围限制),但是正如@Hrvoje所暗示的,对于想要设置输入的最大值的人来说,如果超过了最大值,这将会将输入值重置为空白。 - aidangoodman7

11

我尝试了许多不同的解决方案来实现这一点,最终我想出了这个完美地为我们完成工作的方案。它适用于打字和复制/粘贴,并且我找不到任何不良副作用。

<form>
    <input
        type="number"
        min="0"
        step="1"
        onfocus="this.previousValue = this.value"
        onkeydown="this.previousValue = this.value"
        oninput="validity.valid || (value = this.previousValue)"
    />
</form>

这就像Nikhil Mahirrao的解决方案,但它会简单地忽略无效的按键而不清空输入。


这很完美,而且即使在粘贴时也可以工作,而@wiktor-stribiżew的解决方案则不行。 - Michele Bortot

7
为了只允许数字值,您可以使用以下方法:
<td><input type="number" pattern="\d+" name="itemConsumption" /></td>

1
为什么使用锚点?模式属性默认情况下已经被锚定。 - Wiktor Stribiżew
@stribizhev,对我来说,这使表达更加严格。 - HAYMbl4
1
еҜ№дәҺеҶ…йғЁеј•ж“ҺпјҢе®ғзңӢиө·жқҘдјҡеғҸ/^(?:^\d+$)$/гҖӮзӣёеҪ“з¬ЁжӢҷ :) - Wiktor Stribiżew
@stribizhev,谢谢你的教训,这看起来确实有些笨拙。我在主要部分使用了正则表达式作为SQL的替代,因为我对此并不熟悉。 - HAYMbl4
这行代码仍然接受负值 -。(供参考) - SCS
你确定吗?\d等同于[0-9] - HAYMbl4

6

如果涉及到HTML5,您可以尝试使用min属性:

<input type="number" min="0">

您仍可以手动输入负数。 - Alexander Kim

0

您可以使用此正则表达式模式匹配整数 [0-9]* 或 \d* [0-9] 表示范围为 0 到 9,* 表示不期望任何数字或者您可以输入无限数字


0

Nikhil Mahirrao的答案简洁明了!

我想要类似的东西,但是该字段不应该反弹回一个空字符串,而且还应该忽略任何不是数字的输入。此外,前导零应该被过滤掉。

... oninput="filterNonNumbers(this)" ...

function filterNonNumbers(inputElement) {
    let valOriginal = inputElement.value;
    let valFiltered = valOriginal.split('').filter(c => c.charCodeAt(0) >= 48 && c.charCodeAt(0) <= 57 ? c : '').join('').replace(/^0+/, '');
    if (valOriginal !== valFiltered) {
        inputElement.value = valFiltered;
    }
}

当然,如果直接输入或通过剪贴板粘贴,它的工作方式就像Nikhil的代码一样。

也许有人有类似的扩展要求。


0
也许这个jQuery Codepen代码片段对某些人会有帮助。 它适用于type="number"(而不是"text"):
<input class="js-input-absint" type="number" step="1" min="18"  max="150" name="age" value="50">

仅允许使用[0-9]输入。在输入中,只会打印/粘贴数字[0-9],并带有最小-最大范围(可选)。

一些解释:代码仅在输入阶段显示数字,并且不会像type="number"默认情况下重置值为""(空),以防输入无效的数字值。而且您不能为input type="number"使用属性pattern="/^[0-9]*$/"。

var $inputAbsint = $('.js-input-absint');

if ($inputAbsint.length) {

  $(document).on('keypress', '.js-input-absint', function (event) {

    var allowed = /^[0-9]|Arrow(Left|Right)|Backspace|Home|End|Delete$/;
    return allowed.test(event.key);

  }).on('focusout paste', '.js-input-absint', function () {

    var $input = $(this);
    var defaultValue = this.defaultValue || $input.attr('min');
    // Important(!): Timeout for the updated value
    setTimeout(function () {
        var current = $input.val();
        var regexNumbers = new RegExp(/^[0-9]*$/, 'g');
        var isNumbersOnly = regexNumbers.test(current);
        // Clear wrong value (not numbers)
        if ((current === '' || !isNumbersOnly) && defaultValue.length) {
            $input.val(defaultValue);
            current = defaultValue;
        }
        // Min/Max
        var min = parseInt($input.attr('min'), 10);
        var max = parseInt($input.attr('max'), 10);
        var currentInt = parseInt(current, 10);
        if (!isNaN(min) && !isNaN(currentInt) && currentInt < min) {
            $input.val(min);
        }
        if (!isNaN(max) && !isNaN(currentInt) && currentInt > max) {
            $input.val(max);
        }
    }, 100);

  });

}

请在答案中发布代码,以防链接失效。 - Adrian Krupa

0

您无法在键盘上按下“-”按钮。

<!--HTML Code is below-->
<input type="text" name="value1" id="value1" class="form-control" required="required" onkeyup="keyCode(event)">

<!--JQuery Code is below-->
<script>
       $(document).ready(function() {
        $value1.on("keyup", function keyCode(event){
            var x = event.keyCode;
            if (x == 109 || x == 189) {
                event.preventDefault();
                alert ("You can't enter minus value !");
            }
        });
      });
</script>

'109' 的键码代表键盘上的数字侧减号按钮。'189' 的键码代表字符按钮上方的减号按钮。


0

我想提供一个解决方案,以便在输入时将其四舍五入。

<input id="numinput" type="number" step=1 
oninput="validateWholeNumericInput('numinput', this.value)">

function validateWholeNumericInput(id, val) {

if(val<0){val=0;}
document.getElementById(id).value = Math.round(val);

}

https://jsfiddle.net/mrliioadin/5sn2d07t/5/


1
问题指定输入不允许用户输入负数,但是您的答案将非整数值四舍五入并放入输入值中,这在我看来有点脱离上下文。请仔细阅读问题,以便您的知识实际上能够帮助他人。谢谢。 - pKiran
很好的观点。我编辑了我的答案以更好地回答这个问题。也清理了代码。 - mrliioadin

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