我在模型中进行了验证,如下所示:
validates_numericality_of :shoe_size, :message=>'Please input a number'
但这还不够,因为用户可以输入一些像“42.22222222121212121212 ...”这样的值,这是不期望的。那么,如何验证输入只有两位小数,如42.22
答案 0 :(得分:6)
你可以试试这个:
validates_format_of :shoe_size, :with => /^\d+\.*\d{0,2}$/
答案 1 :(得分:3)
:with => /^\d+\.?\d{0,2}$/
答案 2 :(得分:1)
建立@Bitterzoet的答案,但仍然进行验证(通过the validate
method):
class Product < ApplicationRecord
# Whatever other validations you need:
validates :price, numericality: {greater_than_or_equal_to: 0}
# then a custom validation for precision
validate :price_is_valid_decimal_precision
private
def price_is_valid_decimal_precision
# Make sure that the rounded value is the same as the non-rounded
if price.to_f != price.to_f.round(2)
errors.add(:price, "The price of the product is invalid. There should only be two digits at most after the decimal point.")
end
end
end
答案 3 :(得分:0)
为什么不在收到输入后按摩输入?在我看来,你应该自己将它四舍五入到两位小数,不要让用户担心。
Rails提供round_with_precision所以只需在你的浮点数上调用.round(2)就可以将其四舍五入到小数位数。
答案 4 :(得分:0)
sprintf Ruby类提供了指定要显示的小数位数的能力。例如。 在下面的例子中,我得到了一个轨道的平均评级,并确保将平均值四舍五入到小数点后一位。
sprintf("%.1f",track.ratings.average('rating'))