ruby on rails模型验证的浮点精度

Chr*_*son 5 ruby floating-point validation ruby-on-rails

我正在尝试使用正则表达式验证美元金额: ^[0-9]+\.[0-9]{2}$

这样可以正常工作,但每当用户提交表单并且美元金额以0(零)结束时,ruby(或rails?)会将0关闭.因此500.00变为500.0因此无法进行正则表达式验证.

有没有办法让ruby/rails保持用户输入的格式,而不管尾随的零?

Mla*_*vić 8

我认为您的美元金额是十进制类型.因此,在保存到数据库之前,用户在字段中输入的任何值都是从字符串转换为适当的类型.验证适用于已转换为数字类型的值,因此在您的情况下,正则表达式不是真正合适的验证过滤器.

但是,您有几种可能性来解决这个问题:

  1. 使用validates_numericality_of.这样你就可以完全转换为Rails,只需检查数量是否在给定范围内.
  2. 自己使用validate_each方法和代码验证逻辑(例如,检查值是否超过2位小数).
  3. 在进行类型转换之前验证属性:

这在用户可能为整数字段提供字符串并且您希望在错误消息中显示原始字符串的验证情况下特别有用.通常访问该属性会将字符串类型转换为0,这不是您想要的.

因此,在您的情况下,您应该能够使用:

validates_format_of :amount_before_type_cast, :with => /^[0-9]+\.[0-9]{2}$/, :message => "must contain dollars and cents, seperated by a period"
Run Code Online (Sandbox Code Playgroud)

但是请注意,用户可能会发现它乏味按照你的硬性输入规则(我真的喜欢能够键入500代替500.00,例如),而在某些地区期间是不是小数点分隔符(如果你曾经计划国际化您的应用程序).