1

我有一个用于付款的输入框,我只想允许像 x.xx 这样的数字,当然 xxxx.x 可以工作或 xxxxx

我的设置几乎可以正常工作,但没有一些奇怪的行为。如果小数点后的数字 1 和 2 可以是 2 位长(有效),但如果我按 3-9,那么它只允许该数字中的一个。小数点右侧的 0 也被无限允许。

这就是我正在使用的东西。我也想只允许输入按钮,当按下它时运行一个函数

$('#money-button-input-box').keydown(function(event) {
    var str = $(this).val()

    if(str.length >= 1){
        var rightHalf = str.split('.')[1];
        if(rightHalf >= 3 && event.keyCode != 8 ){
            event.preventDefault();
        }
    }

    if( (event.keyCode == 190 || event.keyCode == 110) && str.replace(/[^.]/g, "").length >= 1 ){
        event.preventDefault();
    }
    allowOnlyNumbers(event);

    if (event.keyCode == 13) {
        if($(this).val() == '')return;
        enterPayment($(this));
    }
});

和功能

function allowOnlyNumbers(events){
    // Allow: backspace, delete, tab, escape, and enter
    if ( events.keyCode == 46 || events.keyCode == 8 || events.keyCode == 9 || events.keyCode == 27 || events.keyCode == 13 || 
    // allow decimals
    events.keyCode == 190 || events.keyCode == 110 || 
    // Allow: Ctrl+A
    (events.keyCode == 65 && events.ctrlKey === true) || 
    // Allow: home, end, left, right
    (events.keyCode >= 35 && events.keyCode <= 39)) {
    // let it happen, don't do anything
        return;
    } else {
        // Ensure that it is a number and stop the keypress
        if (events.shiftKey || (events.keyCode < 48 || events.keyCode > 57) && (events.keyCode < 96 || events.keyCode > 105 )) {
            events.preventDefault(); 
        }   
    }
}

http://jsfiddle.net/Qxtnd/

4

4 回答 4

0
function isNumberKeyUp(event, obj, beforeLength, afterLength) {
    var text = document.getElementById(obj).value;
    var splitText = text.split('.');
    if (splitText.length > 1 && splitText[1].length > afterLength) {
        document.getElementById(obj).value = splitText[0] + "." + splitText[1].substring(0,2);
        return false;
    }
    return true;
}

function isNumberKey(event, obj,beforeLength,afterLength) {
    var keyCode1 = event.keyCode;

    var keyCode = 0;
    if (keyCode1 == 0)
        keyCode = event.which;
    else {
        keyCode = keyCode1;
    }

    if ((keyCode >= 48 && keyCode <= 57) || keyCode == 46 || keyCode == 13 || keyCode == 27 || keyCode == 127 ) {
        var text = document.getElementById(obj).value;
        if (keyCode == 46 && keyCode1 == 0) {
            if (text.toString().indexOf(".") != -1) {
                return false;
            }
        }
        if (keyCode == 46) {
            if (text.toString().indexOf(".") != -1) {
                return false;
            }
        }

        var splitText = text.split('.');
        if (splitText[0].length >= beforeLength) {
            if (keyCode == 46 && text.toString().indexOf(".") == -1) {
                return true;
            } else if (text.toString().indexOf(".") != -1)
            {
                return true;
            }
            return false;
        }
    }
    else {
        return GetDefault(event);
    }
    return true;
}

function GetDefault(event) {
    var keyCode = event.keyCode;
    if (keyCode == 0)
        keyCode = event.which;

    if (keyCode == 8 || keyCode == 9 || keyCode == 35 || keyCode == 36 || keyCode == 37 || keyCode == 38 || keyCode == 39 || keyCode == 40 || keyCode == 46 || keyCode == 118) {
        return true;
    }
    return false;
}

下面是调用此事件的 html

<input type="text" onkeyup="return isNumberKeyUp(event,'txtID',9,2);" onkeypress="return isNumberKey(event,'txtID',9,2);" required="required"  id="txtID" maxlength="12" value="1.00" name="txtID">
于 2013-06-18T09:27:03.440 回答
0

小数的问题是因为你使用

rightHalf >= 3

它评估实际数字而不是它的长度,因为 javascript 将其类型转换为一个数字以进行比较。你想要的是位数,试试

rightHalf.toString().length >= 2

在这里摆弄 http://jsfiddle.net/Qxtnd/1/

编辑

只要rightHalf是一个字符串,您就可以这样做:

rightHalf.length >= 2

如果rightHalf是一个数字,你会得到一个例外。

于 2013-06-18T09:25:04.533 回答
0

这是小提琴

rightHalf.length >= 2
于 2013-06-18T09:31:39.870 回答
-1
    $('#money-button-input-box').keyup(function () {
        $(this).val(FormatNumber($(this).val()));

    });

function FormatNumber(val){
    var split = val.split('.');
    if (split.length>1) return OnlyNumbersAllowed(split[0])+'.'+OnlyNumbersAllowed(split[1]);
    else return OnlyNumbersAllowed(split[0]);
}

function OnlyNumbersAllowed(val){
 return val.replace(/\D/g, '');
}

http://jsfiddle.net/Qxtnd/7/ 您可以轻松地将这个正则表达式放在任何函数中,而不是编写您现在拥有的内容。

于 2013-06-18T09:29:41.297 回答