Javascript中的RegEx允许对文本字段进行负十进制输入

时间:2012-09-26 06:34:17

标签: javascript regex

我有一个要求,其中我需要允许在开头加上加号/减号后跟一个十进制数字,在html中输入的文本字段中只允许一个点。

基本上,文本字段应该允许正常的整数和十进制数以及负整数和负十进制数。只应在开头(第一个字符)允许加号和减号,并且它是可选的。还应该允许任意数量的小数位(例如:-12.12345等),但条目中只有一个小数(点)。

允许的数字是:1,+ 1,-1,.1,+ 1.1,-1.1,-.12,+ 12,123.4456,-123.345,+ 123.345等

非常感谢任何帮助。

我正在使用以下正则表达式来满足上述要求。

var integerOnly = /[\+\-0-9\.]/g;

以及脚本(我从其他一些线程中获得稍作修改)以验证它。

function restrictInput(myfield, e, restrictionType, checkdot){
    if (!e) var e = window.event
    if (e.keyCode) code = e.keyCode;
    else if (e.which) code = e.which;
    var character = String.fromCharCode(code);
    alert("1 " + character);
    // if user pressed esc... remove focus from field...
    if (code==27) { this.blur(); return false; }
    //alert("2");
    // ignore if the user presses other keys
    // strange because code: 39 is the down key AND ' key...
    // and DEL also equals .
    if (!e.ctrlKey && code!=9 && code!=8 && code!=36 && code!=37 && code!=38 && (code!=39 || (code==39 && character=="'")) && code!=40) {
        alert("3");
        if (character.match(restrictionType)) {
            alert("4");
            if(checkdot == "checkdot" & '-' != character & '+' != character){
                alert("5");
                return !isNaN((myfield.value.toString()==''? '0':myfield.value.toString())+character );
            } else {
                return true;
            }
        } else {
            return false;
        }
    }
}

以下是脚本的调用方式。

<input type="text" id="db" width="3" value=""   onkeypress="return restrictInput(this, event, integerOnly, 'checkdot');"/>

除少数情况外,它的工作正常:

  1. 允许+/-任何地方任意次数。我的要求是只允许在开头。
  2. 我尝试修改正则表达式如下。

    var integerOnly = /[\+\-]?[0-9\.]/g;
    

    在这种情况下,它与表达式不匹配。它没有达到警戒4.

    有一点是它只允许一个小数位且不超过一个。

    有人可以帮我修改我的正则表达式,以便在开头只允许+/-一次。

    谢谢。

4 个答案:

答案 0 :(得分:4)

不使用正则表达式,而是使用isNumber函数验证文本,如下所示

function isNumber(n) {
  return !isNaN(parseFloat(n)) && isFinite(n);
}

答案 1 :(得分:1)

我认为你想要这样的东西:

^[-+]?(\d+\.?|\d*\.\d+)$

由于小数点分隔符前面的数字或后面的数字是可选的(例如1..1),但两者都不是,您需要单独处理这些案例。

答案 2 :(得分:0)

var test_ary = ['1', '+1', '-1', '.1', '+1.1', '-1.1', '-.12', '+.12', '123.4456', '-123.345', '+123.345'];

var reg = /^[\+\-]?(?:\.?\d+|\d+\.?\d+)$/;

var i;


for ( i = 0; i < test_ary.length; i = i + 1) {
    console.log(reg.test(test_ary[i]));
}

您也可以尝试使用测试用例:)

答案 3 :(得分:0)

我拿了'niksvp'脚本并修改了一下以满足我的要求。

以下脚本适用于所有类型的+/-十进制数字。例如:1.1,+ 1.1,-1.1,.1,-.1,+ 1,1,1,-1,1 + 123,345,+ 123.345,-123.345等

function isNumber(myfield, e) {
if (!e) var e = window.event
    if (e.keyCode) code = e.keyCode;
    else if (e.which) code = e.which;
    var character = String.fromCharCode(code);

    var n = myfield.value.toString()==''? '0':myfield.value.toString();
    // this is required to allow numbers of this format
    // -1.1, + 1.1, .1, -.1, +.1 etc
    if(n == '-' | n == '+' | n== '.') {
        n +=0;
    }

    if(n.length > 1) {
        n = n.toString() + character;
    }

   return !isNaN(parseFloat(n)) && isFinite(n);
}

感谢大家的帮助。