【问题标题】:javascript regular expression for percentage between 0 and 100 [duplicate]0到100之间百分比的javascript正则表达式[重复]
【发布时间】:2011-07-06 07:37:17
【问题描述】:

可能重复:
Javascript percentage validation

我只想允许 0.00 到 100.00。

function ValidateText(i)
    {

        if(i.value.length>0)
        {
         i.value = i.value.replace(/[^\d.d]+/g, '');

        }
    }
<asp:textbox id="txtrate" runat="server" Width="200px"  onkeyup= "javascript:ValidateText(this)"></asp:textbox>

它允许 0-9.0-9。请帮帮我。谢谢

【问题讨论】:

    标签: javascript .net regex asp.net-2.0


    【解决方案1】:

    现在这是一个流行的问题!

    应该这样做:

    function validate(s) {
      return s.match(/^(100(\.0{1,2})?|[1-9]?\d(\.\d{1,2})?)$/) != null;
    }
    
    var test = [
      '3.0',
      '5',
      '99.99',
      '100',
      '100.00',
      '100.01',
      '101',
      '0.3',
      '.5',
      '0.567',
    ];
    
    for (i=0; i<test.length; ++i) {
      WScript.StdOut.WriteLine(test[i] + ' => ' + validate(test[i]));
    }
    

    输出:

    3.0 => true
    5 => true
    99.99 => true
    100 => true
    100.00 => true
    100.01 => false
    101 => false
    0.3 => true
    .5 => false
    0.567 => false
    

    编辑:正则表达式可以缩短一点而不改变其含义,归功于6502

    /^(100(\.00?)?|[1-9]?\d(\.\d\d?)?)$/
    

    【讨论】:

    • 我会尽可能使用非捕获组(?:...)
    • @Qtax,有什么特别的原因吗?
    • 无需在不需要的地方浪费捕获组/返回引用,请参阅stackoverflow.com/questions/5293986/…
    • 为什么我的评论不能以@SnakE, 开头?它只是被删除。 QQ
    • @Qtax,在这种特殊情况下,很明显没有任何组用于捕获任何内容。因此,我认为用更奇怪的字符将已经不平凡的正则表达式混乱起来是不可行的。
    【解决方案2】:

    这个表达式应该只允许你要求的内容

    /^[1-9]?\d(\.\d\d?)?|100(\.00?)?)$/
    

    意思是

    ^            start of string
    (            start of sub-expression ("or" between two possibilities)
      [1-9]?     an optional non-zero digit
      \d         followed by a digit
      (\.\d\d?)? optionally followed with a dot and one or two digits
    |            or
      100        the string "100"
      (\.00?)?   optionally followed by a dot and one or two zeros
    )            end of sub-expression
    $            end of string
    

    【讨论】:

    • 很好的解决方案,不过我有一个小的改进:将第一个数字 \d 替换为“[1-9]”。这种方式只允许没有前导零的数字。 /^([1-9]\d?(\.\d\d?)?|100(\.00?)?)$/
    • @BasQue:该表达式不允许0.3,感谢您注意到 03 问题
    【解决方案3】:

    试试这个

    ^(?:\d{1,2}(?:\.\d{1,2})?|100(?:\.0?0)?)$
    

    here on Regexr

    (?:) 是非捕获组,这意味着来自该组的匹配不会存储到变量中。

    \d{1,2} 匹配 1 或 2 位数字

    (?:\.\d{1,2})? 这是可选的,. 后跟 1 位或两位数

    100(?:\.0?0)?) 匹配 100 可选地后跟 1 或 2 0

    ^ 匹配字符串的开头

    $ 匹配字符串的结尾

    这两个锚点是必需的,否则如果在有效数字之前或之后有东西,它也会匹配。

    更新: 我不知道,但如果你想在小数部分禁止前导零和没有两位数字的数字,那么试试这个:

    ^(?!0\d)(?:\d{1,2}(?:\.\d{2})|100\.00)$
    

    我去掉了可选部分,所以后面需要有一个点和两个数字。

    (?!0\d) 是一个负前瞻,可确保数字不以 0 开头并紧跟一个数字。

    【讨论】:

    • i.value = i.value.match(^(?:\d{1,2}(?:\.\d{1,2})?|100(?:\. 0?0)?)$);我尝试这种方式。但它仍然允许 0-9.0-9 。
    • @z0mbie,你想禁止什么?点后的前导 0 或单个数字或您不喜欢什么?
    • ,前导0没问题。我只想在 0 到 100 之间。在此范围内,用户也可以键入浮动模式。感谢您的帮助。
    【解决方案4】:

    怎么样:

    var x = '76', // (i.value)
        testx = Number(x.match(/\d+/)[0]);
    console.log(testx>=0 && testx<=100);
    

    应用于你的函数:

    function ValidateText(i) {
     var val = i.value;
     if (val.length>0)  {
       var test = Number(val.match(/\d+/)[0]);
       return test >=0 && test <= 100;
     }
     return false;
    }
    

    【讨论】:

      【解决方案5】:

      使用这个正则表达式:^(?:100(?:\.0{1,2})?|[0-9]{1,2}(?:\.[0-9]{1,2})?)$

      【讨论】:

        【解决方案6】:

        使用这个:

        function ValidateText(i)
        {
            if(i.value.length>0)
            {
                i.value = i.value.match(/[1?\d{1,2}\.\d\d]/)[0];
            }
        }
        

        我没有替换所有不是 (0.00 - 100.00) 的内容(在我看来您正在尝试这样做),而是匹配允许的字符串并仅用匹配的字符串替换原始变量内容。

        请记住,如果您只有 1 个匹配项,这将起作用。如果你有更多,你必须欺骗一下表达式并决定如何连接结果数组。

        【讨论】:

          【解决方案7】:

          我实际上并不认为这主要是一个正则表达式问题。我可能会写这个,特别是如果你想从中得到信息性错误消息:

          HTML:

          <input id="percentValue" type="text" size="20">
          <input type="button" value="Check" onclick="checkPercent()">
          

          Javascript:

          function checkPercent() {
              var o = document.getElementById("percentValue");
              var val = o.value;
              if (val.length == 0) {
                  alert("Empty value");
                  return;
              }
              var index = val.search(/[^0-9\.]/);
              if (index != -1) {
                  o.selectionStart = o.selectionEnd = index;
                  alert("Invalid characters");
                  return;
              }
              if (val.match(/\./g).length > 1)
              {
                  alert("Number must be of the form n.n");
                  return;
              }
              var floatVal = parseFloat(val);
              if (floatVal < 0 || floatVal > 100)
              {
                  alert("Value must be between 0.00 and 100.00");
                  return;
              }
              alert("Valid value of: " + floatVal.toFixed(2));
          }
          

          jsfiddle 在这里:http://jsfiddle.net/jfriend00/rDbAp/

          【讨论】:

          • 好收获。我对此进行了纠正。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-03-20
          • 2016-02-27
          • 2011-11-15
          • 2011-07-03
          • 2012-12-08
          • 1970-01-01
          相关资源
          最近更新 更多