【问题标题】:jQuery only numeric with 2 decimals only with max valuejQuery 只有数字,只有 2 位小数,只有最大值
【发布时间】:2021-01-26 10:25:15
【问题描述】:

我一直在尝试为输入创建验证函数,以仅允许带两个小数点的数字和最大值 99999999.99。

这是我迄今为止尝试过的,但似乎没有用。

$('#TXTCOST').keypress(function (event) {
        if ((event.which != 46 || $(this).val().indexOf('.') != -1) && (event.which < 48 || event.which > 57)) {
            event.preventDefault();
        }
        var input = $(this).val();
        if ((input.indexOf('.') != -1) && (input.substring(input.indexOf('.')).length > 2)) {
            event.preventDefault();
        }
        var arr = input.split('.');
        if (arr.length == 1 && parseFloat(arr[0]) >= 99999999) {
            event.preventDefault();
        }
    });
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="text" id="TXTCOST"/>

【问题讨论】:

  • 检查这可能是工作这个link

标签: javascript html jquery css jquery-ui


【解决方案1】:

下面的示例使用简单的正则表达式检查 1-8 位数字,可选小数点 0-2:

编辑:现在代码可以防止输入错误值。这分两个阶段完成

  • 在按键时,备份当前输入值,然后将用户输入限制为允许的键
  • 验证当前输入,如果新值无效,则恢复为旧值。

  let allowed_keys = [8, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 190];
let my_regex = /^([0-9]{0,8})(\.{1,1}[0-9]{0,2})?$/;
let old_val;
let x = $('#TXTCOST').on('keydown', function (event) {
    let input_value = $(this).val().toString();
    old_val = input_value;
    let found_dots = input_value.match(/\./g) || [];
    let split_input_value = input_value.split('.');
    let prevent_default = false;
    // console.log('value = ' + $(this).val());

    let tests = [];
    tests.push(() => {
        return allowed_keys.includes(event.which);
    });
    tests.push(() => {
        return (event.which !== 190) || ((event.which === 190) && (input_value.length > 0) && (found_dots.length === 0))
    });

    tests.forEach(function (test, index) {
        if (test() === false) {
            event.preventDefault();
        }
    });
}).on('input', function (event) {
    let input_value = $(this).val().toString();
    let tests = [];
    tests.push(() => {
        if (my_regex.test(input_value)) {
            return true;
        } else {
            return false;
        }
    });
    tests.forEach((test, index) => {
        if (test() === false) {
            $(this).val(old_val)
        }
    });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="text" id="TXTCOST"/>

【讨论】:

  • 它允许多个十进制值 99.99.33.33 和最大值是 99999999.99 验证也不起作用。
  • 我的示例仅检查输入,但不会更改文本框或 UX 中的值。请运行代码,然后检查控制台日志输出。您提供的数字应返回“99.99.33.33 未通过正则表达式测试”。对我来说,检查/测试是有效的,现在由你来决定如何处理错误的用户输入。
  • 谢谢 MichaelHabib,它按预期工作,我添加了更多键码,让 allowed_keys = [8, 37, 39, 46, 48, 49, 50, 51, 52, 53, 54, 55、56、57、190、96、97、98、99、100、101、102、103、104、105、110];
【解决方案2】:

像这样试试。

$('#TXTCOST').keypress(function (event) {
        if ((event.which != 46 || $(this).val().indexOf('.') != -1) && (event.which < 48 || event.which > 57)) {
            event.preventDefault();
        }
        else{
            
             var input = $(this).val();
             if ((input.indexOf('.') != -1) && (input.substring(input.indexOf('.')).length > 2)) {
                 event.preventDefault();
             }
             var arr = (input+String.fromCharCode(event.keyCode)).split('.');
             if (arr.length == 1 && parseFloat(arr[0]) > 99999999) {
                 event.preventDefault();
             }
        }
        
    });
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="text" id="TXTCOST"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="text" id="TXTCOST"/>

【讨论】:

  • 请注意,如果您输入123.22,则在删除.22之前不能增加数字
  • 正如 Carsten 提到的,它不允许在输入小数点后更改值,例如 55.22 然后我无法更改 55,我必须删除 .22 才能编辑 55
【解决方案3】:
$('#TXTCOST').keypress(function (event) {
    if ((event.which != 46 || $this.val().indexOf('.') != -1) &&
   ((event.which < 48 || event.which > 57) &&
   (event.which != 0 && event.which != 8))) {
       event.preventDefault();
}
    var input = $(this).val();
    if ((input.indexOf('.') != -1) && (input.substring(input.indexOf('.')).length > 2)) {
        event.preventDefault();
    }
    var arr = input.split('.');
    if (arr.length == 1 && parseFloat(arr[0]) >= 99999999) {
        event.preventDefault();
    }
});

试试这个

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-09
    相关资源
    最近更新 更多