正则表达式 - 项目的成本

时间:2010-11-12 16:23:28

标签: ruby-on-rails regex

正确提供了检查费用的正则表达式是什么:

  • 数字必须大于或等于0.01
  • 数字必须小于或等于99.99

可能的匹配是:

9 | 23.3 | 25.69

不允许:

  1. | 2。

6 个答案:

答案 0 :(得分:2)

我不确定你是否需要使用正则表达式来执行此操作为什么不将字符串拆分为'|'进入数组并检查数组中的每个元素是否大于0.01且小于99.99

答案 1 :(得分:2)

使用正则表达式的解决方案很难维护,因为它是解决问题的一种非常奇怪和不直观的方法。任何阅读你的代码(包括你自己在几周内)的人都很难理解支票的目的是什么。

也就是说,假设值0.00-99.99有效,则正则表达式可能是

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

假设0.01 - 99.99,它有点复杂:

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

不要让我开始0.02 - 99.98 ......: - )

所以基本上,不要这样做。将字符串转换为数值,然后定期检查。

答案 2 :(得分:2)

当然,正确的方法是获取提供的字符串,将其转换为数字(如果它不是可解析的数字则捕获错误),然后将其与有效值进行比较。

如果它 是一个正则表达式,那当然可能但很难看:

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

<强>解释

^                   # start of string
(?:                 # either match
 [1-9][0-9]?        # a number between 1 and 99
 (?:\.[0-9]{1,2})?  # optionally followed by a decimal point and up to two digits
|                   # or
 0?.0[1-9]          # a number between 0.01 and 0.09 (optionally without leading 0)
|                   # or
 0?.[1-9][0-9]?     # a number between 0.1 and 0.99
)                   # end of alternation
$                   # end of string

当然,在大多数正则表达式方言中,您可以使用\d代替[0-9]而不改变含义,但我认为在这种情况下,坚持使用较长版本有助于提高可读性。

在Ruby中,假设您的输入字符串从不包含换行符:

if subject =~ /^(?:[1-9][0-9]?(?:\.[0-9]{1,2})?|0?.0[1-9]|0?.[1-9][0-9]?)$/
    # Successful match
else
    # Match attempt failed
end

由于您关心有效数字的数量,另一种解决方案是首先检查输入是否看起来像一个数字,如果它通过了该测试,则将其转换为浮点并检查它是否在范围内。

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

将匹配0到99.99之间的任何数字(小数点后的整数或小数,最多两位数)。然后你只需要检查数字是否> = 0.01。这种方法的优点是,如果有效数字的要求发生变化,您可以轻松扩展小数点前后允许的数字范围,然后相应地调整值检查。

答案 3 :(得分:0)

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

检查是否有1位或2位数,如果有点,则检查点后面是否有1位或2位数。

作为对您问题评论的回答:在将请求发送到服务器或其他内容之前,没有任何事情可以反对检查格式。范围检查可以在其他地方完成。

答案 4 :(得分:0)

这不是最好但是有效

(0\.01|0\.02|0\.03| ... |99\.98|99\.99)

答案 5 :(得分:0)

由于您使用的是Rails,因此在模型中使用validates_numericality_of可能会提供更好的服务:

validates_numericality_of :cost, :greater_than_or_equal_to => 0.01, 
                                 :less_than_or_equal_to => 0.99

为了防止小数便士,请将其与validates_format_of

结合使用
validates_format_of :cost, :with => /\A\d*(\.\d{1,2})?\Z/

这充分利用了每次验证的优势。