Rails的价格验证4

时间:2016-07-22 01:56:30

标签: ruby-on-rails ruby

我的rails应用程序中有一个pieces模型,每个部分都有一个名为:price的小数。我想验证这个价格是小数点后两位,大于0,不到一百万美元。我已经查看了堆栈溢出的众多来源,每当我为这些验证键入小数时,例如4.99,价格变为4.990000000000000213162820728030055761。这已经发生在我查找过的所有验证中。这是因为我需要在数据库中指定小数的精度吗?我该如何解决这个问题?

我目前的验证:

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

谢谢你们!

3 个答案:

答案 0 :(得分:13)

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

height:50%; width:auto;

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

关于验证,
如果你想要function downloadFile(id) { window.location = "/Controller/DownloadFile?fileid=" + id; } 应该总是有两个小数位(即:4.99)你可以试试这个,

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

如果你想:price最多只有两位小数或更小(即:4,4.9,4.99),你可以试试这个,

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

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

答案 1 :(得分:1)

您应该在数据库上设置它。例如,在迁移中:

add_column :products, :price, :decimal, precision: 5, scale: 2
  

精确度是数字中的位数。比例是数量   数字小数点右边的数字。例如,   数字123.45的精度为5,比例为2.在SQL Server中,   数字和十进制数据类型的默认最大精度为38。

https://msdn.microsoft.com/en-us/library/ms190476.aspx

答案 2 :(得分:1)

如果您发现自己的值已添加其他数字,那么可能发生的情况是您的列被设置为浮点类型。如果您正在使用美元值,请不要使用浮点数。 M. Karim的回答很好。