如何验证数值的小数?

时间:2011-04-06 07:09:07

标签: ruby-on-rails ruby-on-rails-3

我在模型中进行了验证,如下所示:

validates_numericality_of :shoe_size, :message=>'Please input a number'

但这还不够,因为用户可以输入一些像“42.22222222121212121212 ...”这样的值,这是不期望的。那么,如何验证输入只有两位小数,如42.22

5 个答案:

答案 0 :(得分:6)

你可以试试这个:

validates_format_of :shoe_size, :with => /^\d+\.*\d{0,2}$/

答案 1 :(得分:3)

<@> @warren回答但拿出*然后放一个?因为你可以做3 ..... 0但是?你可以有零或一个。

    :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'))