【问题标题】:Preventing user to enter more numbers after 2 digits before decimal point防止用户在小数点前 2 位后输入更多数字
【发布时间】:2013-09-26 06:09:33
【问题描述】:

我在让用户在我的具有相同类的文本框中输入数值时遇到问题。

我想要什么:

  • 只允许用户输入小数点前2个数字,小数点后2个;否则所有键都是日志,除了箭头键、退格键和删除键

当前问题

  • 用户只能输入2个数字;但是,他/她添加小数点后,他们可以在小数点前添加更多数字
  • 目前,用户只能输入5位数字--小数点前2位,小数点后2位。当他们删除小数点后的一位时,他们仍然可以在该小数点前添加更多的数字。

我的 HTML:

<form method="post">
    <div class="row">
        <label>Val 1</label>
        <input type="text" class="validate" name="val1" maxlength="5" />
    </div>
    <div class="row">
        <label>Val 2</label>
        <input type="text" class="validate" name="val2" maxlength="5" />
    </div>
    <div class="row">
        <label>Val 3</label>
        <input type="text" class="validate" name="val3" maxlength="5" />
    </div>
    <div class="row">
        <button type="submit">Send</button>
    </div>
</form>

我的 JS:

Number.prototype.between  = function (a, b, inclusive) {
        var min = Math.min.apply(Math, [a,b]),
            max = Math.max.apply(Math, [a,b]);
        return inclusive ? this >= min && this <= max : this > min && this < max;
    };  
$('.validate').keypress( function( event ) {
        var v = parseFloat($(this).val() + String.fromCharCode(event.which));

        textValue = parseFloat(v).toString();
        var newVal = parseInt( textValue.substr(0, textValue.indexOf(".")) );

        console.log(newVal);
        if(textValue.length < 6){
           if(!parseFloat(v).between(0,99.99,true)) {
                v = this.value.substring(0, 2);
                $(this).val(v);
                return false;
            } 
            return true;
        }
    });

这是我的fiddel DEMO的链接

【问题讨论】:

    标签: javascript jquery validation numeric


    【解决方案1】:

    试试这个:

       <input type="text" class="validate" name="val1" maxlength="5" onkeypress="return CheckDecimalValues(event)" />
    
    function CheckDecimalValues(evt) {
        var keyCode = evt.keyCode ? evt.keyCode : ((evt.charCode) ? evt.charCode : evt.which);
        //    8   Backspace
        //    9   Tab key 
        //    46  Delete
        //    35  End Key
        //    36  Home Key
        //    37  Left arrow Move
        //    39  Right arrow Move
        if (!(keyCode >= 48 && keyCode <= 57)) {
            if (!(keyCode == 8 || keyCode == 9 || keyCode == 35 || keyCode == 36 || keyCode == 37 || keyCode == 39 || keyCode == 46)) {
                return false;
            }
            else {
                return true;
            }
        }
    
        var velement = evt.target || evt.srcElement
        var fstpart_val = velement.value;
        var fstpart = velement.value.length;
        if (fstpart .length == 2) return false;
        var parts = velement.value.split('.');
        if (parts[0].length >= 14) return false;
        if (parts.length == 2 && parts[1].length >= 2) return false;
    }
    

    【讨论】:

    • 我刚刚发现这种方法存在问题。当用户复制/粘贴超过 2 个小数点的数字时,是允许的。所以我使用了 BGS 和 Aashray 建议的两种方法。
    【解决方案2】:

    您为什么不使用正则表达式来验证您的需求?

    一个像这样的简单正则表达式:

    [0-9]{1}[0-9]{1}[\.]{1}[0-9]{1}[0-9]{1}

    可用于验证输入而无需担心击键。只需在您的文本框中添加一个onblur 事件即可验证这一点。

    编辑:

    我已经添加了这个Fiddle

    检查一下。

    【讨论】:

    • 你能告诉我如何集成到按键事件中吗?我很抱歉,因为我对 jquery 很陌生
    • 我添加了一个小提琴。看看它是否满足您的要求。
    • 啊,这不起作用。我目前希望用户在小数点前后只输入 2 位数字。我的问题是,当用户删除最后 2 位数字时,他们可以在前 2 位数字上再添加 1 位数字
    • 你能举个例子吗?
    猜你喜欢
    • 2017-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多