jquery - 使用正则表达式验证 2dp 十进制值
问题描述
到目前为止,我的代码有效,但是当设置了两个小数时,我无法输入任何数字。知道有什么问题吗?
$("input").keypress(function(e) {
var el = $(this);
var key = e.keyCode || e.which;
key = String.fromCharCode(key);
var value = el.val() + key;
var regex = /^\d+(,\d{0,2})?$/;
if (!regex.test(value)) {
e.returnValue = false;
if (e.preventDefault) e.preventDefault();
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="text" value="1234,56">
解决方案
您的代码还将拒绝退格键、删除键和箭头键,这将使用户几乎不可能更正已经存在的数字。
我建议不要响应事件,keypress
而是响应input
事件,因为它也会在通过鼠标(拖入文本)、上下文菜单(清除、粘贴)或其他输入设备进行更改时触发。
不同之处在于input
在进行更改后触发,但这还不错。您可以删除不符合正则表达式的输入部分:
$("input").on('input', function(e){
var clean = $(this).val().replace(/^(\d+(,\d{0,2})?)?.*/g, "$1");
$(this).val(clean);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="text" value="1234,56">
上述解决方案删除了违反模式的字符之后的其余输入。如果您想保留尽可能多的输入字符,您可以执行一个循环,一次只删除一个违规字符:
$("input").on('input', function(e){
var clean = $(this).val(), input;
while (input != clean) {
input = clean;
clean = input.replace(/^(\d+(,\d{0,2})?)?.?/g, "$1");
}
$(this).val(clean);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="text" value="1234,56">
推荐阅读
- artifactory - jfrog artifactory 无法验证路由器错误
- python-3.x - Leetcode 缺失数字练习 Python 3
- python - 为什么我的数据不会显示在我的 Plotly 地图中?
- azure-logic-apps - 表单识别器 - 调用分析表单 API 时找不到 404 资源
- c - 下载hex并从avr反编译
- .htaccess - 如何处理带有差异的两个不同域的重定向。一个 .htaccess 文件中的层次结构
- vba - 使用网站上的文件夹选择器自动从已知位置选择图片
- date - 日期列表(每 2 周),包括当月的第一天
- r - 在R中从军用时间转换为UTC
- r - 根据满足R中的多列条件删除行