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

标签 ruby-on-rails ruby validation floating-point

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

这工作正常,但每当用户提交表单并且美元金额以 0(零)结尾时,ruby(或 rails?)将 0 砍掉。 所以 500.00 变成 500.0,因此正则表达式验证失败。

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

最佳答案

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

不过,您有几种可能性可以解决这个问题:

  1. 使用validates_numericality_of。这样您就可以将转换完全交给 Rails,只需检查金额是否在给定范围内即可。
  2. 使用 validate_each 方法并自行编写您的验证逻辑(例如,检查该值是否有超过 2 位小数)。
  3. 验证attribute before it's been typecasted :

This is especially useful in validation situations where the user might supply a string for an integer field and you want to display the original string back in an error message. Accessing the attribute normally would typecast the string to 0, which isn‘t what you want.

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

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

但是请注意,用户可能会发现遵循严格的输入规则很乏味(例如,我真的更希望能够输入 500 而不是 500.00),并且在某些语言环境中,句点不是小数点分隔符(如果您打算将您的应用程序国际化)。

关于ruby-on-rails - ruby on rails 模型验证中的浮点精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2766959/

相关文章:

ruby-on-rails - 如何使用 ruby​​ 在两个新行上拆分文本

ruby-on-rails - rails bootstrap-sass Assets 编译错误 - undefined variable 警报填充

ruby 我应该使用 self.或者 @

ruby - 获取全局变量指向的当前值

ruby-on-rails - 验证失败后保留表单字段, "render"不起作用

ruby-on-rails - nginx+passenger 上的 rails 应用程序未显示自定义错误页面

ruby-on-rails - 如何针对组合字段的唯一性对这种复杂的验证进行建模

java - Camel Bean Validator 找不到组件

javascript - 为什么 AUI 的 Dropdown 在文本字段验证之前需要验证火拳

jquery - 对更新的 CSS 文件所做的更改不会生效