2

我有一个要求,其中我需要在开头允许加号/减号,后跟一个十进制数字,该数字在 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. 它允许 +/- 任意位置任意次数。我的要求是只在开始时允许。

我尝试如下修改正则表达式。

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

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

一件事是它只允许一个小数位并且不超过一个。

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

谢谢你。

4

4 回答 4

4

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

function isNumber(n) {
  return !isNaN(parseFloat(n)) && isFinite(n);
}
于 2012-09-26T06:38:02.227 回答
1
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]));
}

你也可以试试这个,用测试用例:)

于 2012-09-26T06:41:29.870 回答
1

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

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

由于小数点分隔符之前的数字或之后的数字是可选的(例如1..1)但两者都不是,因此您需要分别处理这些情况。

于 2012-09-26T06:37:57.267 回答
0

我采用了“niksvp”脚本并进行了一些修改以满足我的要求。

以下脚本适用于所有类型的 +/- 十进制数字。例如: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);
}

感谢大家的帮助。

于 2012-09-27T05:30:03.970 回答