【问题标题】:Simple regular expression for a decimal with a precision of 2精度为 2 的小数的简单正则表达式
【发布时间】:2010-09-23 09:57:10
【问题描述】:

精度为 2 的小数的正则表达式是什么?

有效例子

123.12
2
56754
92929292929292.12
0.21
3.1

无效示例:

12.1232
2.23332
e666.76

小数点可以是可选的,也可以包括整数。

【问题讨论】:

标签: regex


【解决方案1】:

有效的正则表达式标记因实现而异。通用形式是:

[0-9]+(\.[0-9][0-9]?)?

更紧凑:

\d+(\.\d{1,2})?

两者都假设小数点前至少有一位数,小数点后一位数。

要要求整个字符串是这种形式的数字,请将表达式包装在开始和结束标记中,例如(在 Perl 的形式中):

^\d+(\.\d{1,2})?$

要匹配小数点前没有前导数字 (.12) 的数字和具有尾随句点的整数 (12.),同时排除单个句点的输入 (.),请尝试以下操作:

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

添加

将小数部分包装在()? 中以使其可选。请注意,这不包括12. 等形式,包括更像^\d+\\.?\d{0,2}$

添加

使用^\d{1,6}(\.\d{1,2})?$ 停止重复并限制整个十进制值。

【讨论】:

  • 在数学上,我认为精度为 2 的数字应该总是有两位小数,即使最后一个是零。这是基于我对有效数字的经验,所以它可能是错误的,但你实际上并不知道 1.7 是 1.70 还是 1.70 到 1.74 之间的任何数字。
  • 谢谢!正是我需要的:) +1
  • @DocMax,如果 ^\d+(\.\d{1,2})?$ 表达式支持负数,我需要更改什么?比如 -4509.45 或 -.45 或 -0.45
  • 添加了'-?'在此 ^\d+(\.\d{1,2})?$ ===> ^-?\d+(\.\d{1,2})?$ 用于支持 -ve
  • @BimalDas,您可以通过在表达式前面加上 -? 来支持否定,如 -?\d+(\.\d{1,2})?。我没有包括负数或以小数点开头,因为这些不在 OP 的问题中,尽管它们对于更通用的数字格式肯定是有效的。这里的 cmets 线程给出了几种处理“.21”的方法。
【解决方案2】:

您不需要考虑e666.76 中的e 吗?

(e|0-9)\d*\d.\d{1,2)

【讨论】:

  • 不,这超出了项目的范围!不过谢谢,它很方便:)
【解决方案3】:
^[0-9]+(\.[0-9]{1,2})?$

由于正则表达式很难读,更难理解,这里是冗长的等价物:

^                         # Start of string
 [0-9]+                   # Require one or more numbers
       (                  # Begin optional group
        \.                # Point must be escaped or it is treated as "any character"
          [0-9]{1,2}      # One or two numbers
                    )?    # End group--signify that it's optional with "?"
                      $   # End of string

在大多数正则表达式实现(包括最常见的PCRE)中,您可以将[0-9] 替换为\d。我将其保留为 [0-9],因为我认为它更易于阅读。

另外,这是我用来检查它的简单 Python 脚本:

import re
deci_num_checker = re.compile(r"""^[0-9]+(\.[0-9]{1,2})?$""")

valid = ["123.12", "2", "56754", "92929292929292.12", "0.21", "3.1"]
invalid = ["12.1232", "2.23332", "e666.76"]

assert len([deci_num_checker.match(x) != None for x in valid]) == len(valid)
assert [deci_num_checker.match(x) == None for x in invalid].count(False) == 0

【讨论】:

  • 我想要小数点前最多 3 位数字,尝试这样没有运气 ^([0-9]{0,3})+(\.[0-9]{1,2}) ?$
  • @Raghurocks 删除第一个结束括号后的+ ^([0-9]{0,3})(\.[0-9]{1,2})?$
  • 对于 Java 用户:小数点不应被转义。
  • @Gracchus 你确定吗?它可能应该是\\. 而不是\.,因为. 看起来很有效,但匹配任何字符(不仅仅是小数位)。例如,1z231.23 如果你不转义它可能会被认为是有效的
  • @dbr 也许应该是这样。 Java 只是抱怨转义不当。删除“修复它”(闭嘴),大声笑。我还没有机会对其进行全面测试。
【解决方案4】:

要包含一个可选的减号并禁止使用像 015 这样的数字(可能会被误认为是八进制数),请写:

-?(0|([1-9]\d*))(\.\d+)?

【讨论】:

  • 这对我来说允许小数点前的 alpha。允许 X.25
  • 这并不限制小数位数为 2。
【解决方案5】:

试试这个

 (\\+|-)?([0-9]+(\\.[0-9]+))

它也允许正负号。

【讨论】:

    【解决方案6】:
    preg_match("/^-?\d+[\.]?\d\d$/", $sum)
    

    【讨论】:

      【解决方案7】:

      我用这个最多保留两位小数:
      (^(\+|\-)(0|([1-9][0-9]*))(\.[0-9]{1,2})?$)|(^(0{0,1}|([1-9][0-9]*))(\.[0-9]{1,2})?$) 通行证:
      .25
      0.25
      10.25
      +0.25

      没有通过:
      -.25
      01.25
      1.
      1.256

      【讨论】:

      • 这也传递了一个空白值。
      【解决方案8】:

      我在我的项目中尝试了一个。 这也允许带有+ | - 符号的数字。

      /^(\+|-)?[0-9]{0,}((\.){1}[0-9]{1,}){0,1}$/
      

      【讨论】:

        【解决方案9】:

        对于没有千位分隔符的数字,我喜欢这个简单、紧凑的正则表达式:

        \d+(\.\d{2})?|\.\d{2}
        

        或者,不限于精度为 2:

        \d+(\.\d*)?|\.\d+
        

        后者匹配
        1
        100
        100.
        100.74
        100.7
        0.7
        .7
        .72

        而且它不匹配空字符串(如 \d*.?\d* 会)

        【讨论】:

          【解决方案10】:

          一般来说,即无限位小数:

          ^-?(([1-9]\d*)|0)(.0*[1-9](0*[1-9])*)?$.

          【讨论】:

          • 不匹配22.00,例如
          【解决方案11】:
          ^[0-9]+(\.([0-9]{1,2})?)?$
          

          将使12. 之类的内容被接受。这不是普遍接受的,但如果你需要“灵活”,这是一种方法。当然[0-9] 可以替换为\d,但我想这样更易读。

          【讨论】:

          • 工作正常。谢谢:)
          【解决方案12】:

          也添加我的答案,有人可能会觉得它有用,或者也可能是我的正确答案。

          function getInteger(int){
            var regx = /^[-+]?[\d.]+$/g;
            return regx.test(int);
          }
          
          
          alert(getInteger('-11.11'));
          

          【讨论】:

            【解决方案13】:

            这对我有用:

            (-?[0-9]+(\.[0-9]+)?)
            

            Group 1 是您的浮点数,group 2 只是小数。

            【讨论】:

              【解决方案14】:
               function DecimalNumberValidation() {
                      var amounttext = ;
                          if (!(/^[-+]?\d*\.?\d*$/.test(document.getElementById('txtRemittanceNumber').value))){
                          alert('Please enter only numbers into amount textbox.')
                          }
                          else
                          {
                          alert('Right Number');
                          }
                  }
              

              函数将验证任何十进制数字天气数字是否有小数位,它会说“正确的数字”,否则“请仅在金额文本框中输入数字”。将出现警报消息。

              谢谢... :)

              【讨论】:

                【解决方案15】:

                Chrome 56 不接受这种带有类型编号的模式(Chrome 56 正在接受 11.11。一个附加的。),使用类型作为文本作为进度。

                【讨论】:

                  【解决方案16】:

                  主要答案是错误的,因为它有效 5.5, 输入

                  这段代码处理它(但在我的例子中,负数是禁止的):

                  /^[0-9]+([.,][0-9]{1,2})?$/;
                  

                  结果如下:

                  true => "0" / true => "0.00" / true => "0.0" / true => "0,00" / true => "0,0" / true => "1,2" 真=>“1.1”/真=>“1”/真=>“100”真=>“100.00”/真=>“100.0”/真=> "1.11" / true => "1,11"/ false => "-5" / false => "-0.00" / true => "101" / false => “0.00.0”/真=>“0.000”/真=>“000.25”/假=>“.25”/真=>“100.01”/ 真=>“100.2”/真=>“00”/假=>“5”。 /假=>“6”/真=>“82”/真=> "81,3" / true => "7" / true => "7.654"

                  【讨论】:

                    【解决方案17】:

                    这将允许十进制取幂和最多 2 位数字,

                    ^[+-]?\d+(\.\d{2}([eE](-[1-9]([0-9]*)?|[+]?\d+))?)?$
                    

                    Demo

                    【讨论】:

                    • 不匹配整数也不匹配 1.2e-10
                    • 是的,谢谢您的指正。我以为它只适用于十进制数字
                    • ([0-9]+)? 最好写成\d*。现在它与10e3 不匹配。并且 OP 希望匹配最多 2 位数字。
                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2016-04-04
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2011-07-09
                    • 2016-01-17
                    • 1970-01-01
                    相关资源
                    最近更新 更多