【发布时间】:2016-03-06 09:41:45
【问题描述】:
我有一个通过正则表达式验证小数精度的模型:
class Loan < ActiveRecord::Base
validates :amount,
format: {with: /\A\d+(?:\.\d{0,2})?\z/}, numericality: {less_than: 1000000}, allow_blank: true
end
在 Rails 4.2.4
l = Loan.new
l.amount = 1.1111
l.valid? # false
在 Rails 4.2.5
l = Loan.new
l.amount = 1.1111
l.valid? # true
我的正则表达式中存在问题,该问题被较新版本或 Rails、Rails 验证本身或其他原因暴露?
【问题讨论】:
-
我认为问题不在于正则表达式,而可能是验证发生了变化。对于您的具体问题,您可以使用 Money gem 来处理货币,这很有帮助;)
-
仅供参考:如果您不希望
1.有效,请使用{1,2}而不是{0,2}。 -
我很惊讶能够使用正则表达式验证浮点数。在恕我直言中没有多大意义。这可能是一个错误,已在最新版本中修复。
-
@spickermann 金额的基础数据结构是十进制的,因此验证试图验证十进制精度。从 Rails 3 到现在一直在做这些类型的验证。
-
小数精度不是你可以改变和验证的。它是为计算机固定的。即使你向它申请
to_s,也不会改变这种情况。
标签: ruby-on-rails ruby regex ruby-on-rails-4 ruby-on-rails-4.2