ruby-on-rails - Rails 4 的价格验证

标签 ruby-on-rails ruby

我的 Rails 应用程序中有一个 pieces 模型,每个 piece 都有一个名为 :price 的小数。我想验证这个价格是小数点后两位,大于0,小于百万美元。我查看了 Stack overflow 上的许多来源,每当我为这些验证输入小数时,例如 4.99,价格就会变成 4.990000000000000213162820728030055761。我查找的所有验证都发生了这种情况。这是因为我需要在我的数据库中指定我的小数精度吗?我该如何解决这个问题?

我当前的验证:

validates :price, :presence => true, :format => { :with => /\A(\$)?(\d+)(\.|,)?\d{0,2}?\z/ }

谢谢大家!

最佳答案

我不知道您使用的是哪个数据库,但您可以像这样在迁移中定义精度,

add_column :pieces, :price, :decimal, precision: 8, scale: 2

它会给你总共 8 位数字,小数点后有 2 位。

关于验证,
如果您希望 :price 始终保留两位小数(即:4.99),您可以试试这个,

 validates :price, presence: true, format: { with: /\A\d+(?:\.\d{2})?\z/ }, numericality: { greater_than: 0, less_than: 1000000 }

如果您希望 :price 最多有两位小数或更少(即:4、4.9、4.99),您可以试试这个,

validates :price, presence: true, format: { with: /\A\d+(?:\.\d{0,2})?\z/ }, numericality: { greater_than: 0, less_than: 1000000 }

或者,如果您不想验证精度,只想在将精度保存到数据库之前对其进行四舍五入,您可以使用 round_with_precision .

关于ruby-on-rails - Rails 4 的价格验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38517013/

相关文章:

ruby-on-rails - 来自控制台的 Ruby on rails -(表不存在)

ruby-on-rails - 如何在Rails应用程序中汇总不同的货币?

ruby-on-rails - Rails rake 任务在运行时不断消耗更多 RAM(使用 Mechanize 抓取网站)

javascript - Stripe::InvalidRequestError(必须提供来源或客户。):Stripe

ruby-on-rails - 守护进程在应用程序启动时启动

ruby - Mongo 可以实现多线程吗?

ruby-on-rails - Guard with RSpec on Rails 4 发出大量警告

java - Ruby 中的常量和 Java 的 Final 关键字

ruby - 如何在 Ruby 中用数组替换字符串参数?

ruby-on-rails - 为什么 ruby​​ REGEX\A...\z 允许在开始时输入任何内容?