【问题标题】:RegEx in Javascript to allow negative decimal input to a text fieldJavascript中的RegEx允许对文本字段进行负十进制输入
【发布时间】:2012-09-26 06:34:17
【问题描述】:

我有一个要求,我需要在开头允许加号/减号,后跟一个十进制数字,该数字在 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。

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

谁能帮我修改我的正则表达式,以便在开头只允许 +/- 并且只允许一次。

谢谢。

【问题讨论】:

  • 要轻松使用 RegEx 并立即查看结果,请尝试 regexpal.com

标签: javascript regex


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    由于小数点前或后的数字是可选的(例如1..1),但两者都不是,您需要分别处理。

    【讨论】:

      【解决方案3】:
      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]));
      }
      

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

      【讨论】:

      • 我尝试了上述方法,但似乎不起作用。我编辑了我的原始帖子,你能看看它是否有任何问题。
      • 老实说,我的回答存在一些问题,但@niksvp 的回答会以最好的方式完成您的请求,您应该遵循他的回答,在这种情况下不要使用 RegExp。
      【解决方案4】:

      我采用了“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);
      }
      

      感谢大家的帮助。

      【讨论】:

      • 脚本的使用方式需要如下:
      • 我不明白这个脚本如何验证或它为您服务的目的是什么?
      • 另外,它只允许 +/- 符号出现在开头,并且只允许一个小数点。
      • 脚本只允许对文本字段进行有效输入。在假设接受有效十进制输入的文本字段中,如果您尝试在该字段中输入任何字母数字或无效数字,它什么也不做。这样,您可以验证输入。当然,我们也需要提供服务器端验证,以防万一脚本被禁用,以某种方式绕过。
      • 好吧,它似乎仍然允许我输入第一个字符作为字母。
      猜你喜欢
      • 2022-11-29
      • 2015-06-27
      • 2017-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-07
      • 1970-01-01
      相关资源
      最近更新 更多