ruby on rails模型validation的浮点精度

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

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

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

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

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

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

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

所以,在你的情况下,你应该能够使用:

 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 ),并且在某些区域设置期间不是小数点分隔符(如果您曾计划国际化你的应用程序)。

通常,如果您希望“记住”浮点值的小数精度,则应使用十进制类型,而不是二进制浮点数。

另一方面,我不确定为什么你希望以如此严格的方式强制字符串表示…如何接受任何数字并用例如number_to_currency格式化它?

通常有钱,最好将其存储为美分整数(500美分为5.00美元)。 我使用Money gem来处理这个问题。