【问题标题】:How do I validate a decimal field with jquery and regex?如何使用 jquery 和 regex 验证十进制字段?
【发布时间】:2012-02-09 02:55:18
【问题描述】:

这是我目前所拥有的:

$j(element)..keypress(function(e){
        var val = $j(this).val();
        if (("1234567890.").indexOf(e.charCode) > -1){
            if (val.length > 0){
                var regex = /(\+|-)?(\d*\.\d*)/;
                if (regex.test(val)){
                    return true;
                } else {
                    return false;
                }       
            } else {
                return true;
            }
        } else {
            return false;
        }
    });

但由于某种原因,文本字段只允许一个字符...甚至一个数字

【问题讨论】:

    标签: jquery


    【解决方案1】:

    这会检查一个十进制数,带有可选的 +/- 符号字符。在 google 中找到不到 5 秒。 /^\s*(\+|-)?((\d+(\.\d+)?)|(\.\d+))\s*$/

    【讨论】:

    • 这样做有什么问题? (\+|-)?(\d*\.\d*) 这使得小数点是可选的,但小数点本身仍然可以存在。
    • 我没有检查实际代码,但它似乎是正确的,我只是从ntt.cc/2008/05/10/…复制/粘贴
    • 显然,问题是我在输入文本后没有做测试
    • 为什么需要在keypress事件中做呢?我一直在尝试解决方案,但它变得复杂。基本上,第一个字符和. 被拒绝。我试过keyup,它似乎解决了第一个字符的问题,但不是.。使用按钮验证可能更容易......看jsfiddle.net/9U2Mw/2
    • 只检测数字和. 上的keypressif ( (e.which >= 48 && e.which <= 57) || e.which == 190 || e.which == 110 ) { // blabla } 之类的东西怎么样。然后在提交时验证?他们仍然有很小的机会输入无效的内容,例如 12.4.55 tho。
    【解决方案2】:

    首先,回报不应该是相反的吗? true 如果测试成功,false 否则?

    其次,正则表达式中的. 表示“任何字符”。如果您只想匹配一个点,请使用\.

    这样你的正则表达式就可以工作了。但是,为了获得更好的结果,请使用 elclanrs 提供的正则表达式。

    注意:keypress 运行时,该值似乎仍未更改,因此匹配的是旧值,而不是新值。

    更新:这不是理想的解决方案,但仍然可以使用 - 您可以使用 this question 中的代码来观察输入值的变化(它不过使用轮询):

    $(element).watch("value", function(propName, oldVal, newVal) {
        var regex = /^(\d*\.?\d*)$/;
        if (!regex.test(newVal)){
            $(this).val(oldVal);
        }
    });
    

    【讨论】:

    • 是的,我注意到之后,我发布了。但是在 Rubular.com 上,这个 (\+|-)?(\d*\.\d*) 与这个测试字符串一起工作: 23.43 23. .32 0.23 43.54 23 -23 -45.34 -.43 -0.34 但现在我无法在文本字段中输入任何内容
    • 是的,我刚刚注意到(请参阅我的更新)。我们需要找到一种方法来检查更新的字符串...
    • 嗯。然后我必须检查 jquery api
    • 如果您找到更好的解决方案,请在此处发布,我也对此感兴趣。但是,请参阅我的更新以了解短期解决方法。
    • 我将使用我当前的功能进行更新。它的行为与我最初的问题相同,但我对此感觉更好。
    【解决方案3】:

    在@elclanrs 和@mgibsonbr 的帮助下,我得出了这个结论:

    $j = jQuery.noConflict();
    $j(function() {
        $j("input").keypress(function(e) {
            var val = $j(this).val();
            var regex = /^(\+|-)?(\d*\.?\d*)$/;
            if (regex.test(val + String.fromCharCode(e.charCode))) {
                return true;
            }
            return false;
        });
    });
    

    可以在这里测试:http://jsfiddle.net/9U2Mw/5/

    【讨论】:

    • 输入+,在它前面点击,输入2。恕我直言,您使用户的生活更加困难,而没有防止所有情况下的无效输入。但是我已经提出了我的意见,如果你真的更喜欢keypress 的方法,那就去吧。
    • 哦,好吧,我只需要找到一种方法,不允许在 + 或 - 之前输入
    猜你喜欢
    • 1970-01-01
    • 2011-12-15
    • 2011-07-09
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    相关资源
    最近更新 更多