正如上面的问题所述,我如何将用户输入限制为分数(不包括混合数)和整数?例如3/4或-5,但不是-3 4/5。
我还希望程序将字符限制为整数和分数。所以我不希望允许额外的字符,比如空格或字母。
我相信可能有一种方法可以用正则表达式做到这一点,这将是我更喜欢的答案。
您可以使用正则表达式[-]?[0-9]*[/]?[0-9]+
,然后在input
中利用pattern
属性:
<form>
<input type="text" name="whatever" pattern="[-]?[0-9]*[/]?[0-9]+" oninput="this.reportValidity()" />
</form>
你可以使用这个过滤器:
<form>
<input type="text" oninput="this.value = this.value.replace(/^(-?(?:d+(?:/d*)?)?).*$/, '$1')" />
</form>
解释:
^
-输入起始(
-开始捕获组-?
-期望可选的-
在开始(?:
-非捕获组启动d+
-期望1+数字(?:
-非捕获组启动/d*
-期望斜杠和可选数字
)?
-非捕获组结束,?
使其为可选
)?
-非捕获组结束,?
使其可选)
-捕获组结束.*
-所有剩下的$
-输入结束- 替代
'$1'
的参考捕获组
我在JavaScript中做过,检查该行是否只是整数,或者该行只是分数,如果不是,将输入替换为找到的分数。如果您需要任何不同的行为,只需更改inputValidator函数。
输入是onblur验证的,你必须把鼠标从输入框中移开,然后在外面点击。
const allIntegers = /^(?:[+-]?d+(?: |$))+$/;
const allFractions = /^(?:[+-]?d+/d+(?: |$))+$/;
function inputValidator(obj) {
const text = obj.value;
if(!allIntegers.test(text)&&!allFractions.test(text)){
alert("Not Ok!");
obj.value = (text.match(/[+-]?d+/d+/g)||[]).join(" ");
} else{
alert("Ok");
}
}
<form>
<input id="my_form" type="text" name="My Form" onblur="inputValidator(this)" />
</form>