как проверить десятичное число для числового значения?

#ruby-on-rails #ruby-on-rails-3

#ruby-on-rails #ruby-on-rails-3

Вопрос:

У меня есть моя проверка в модели следующим образом:

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

Но этого недостаточно, потому что пользователь может ввести некоторое значение типа «42.222222221212121212121212 …», которое не ожидается. Итак, как проверить входные данные, чтобы они содержали только два десятичных знака, например 42.22

Ответ №1:

Вы могли бы попробовать это:

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

Ответ №2:

@warren ответь, но убери * и поставь a ? потому что вы могли бы сделать 3 …..0, но с ? у вас может быть ноль или единица.

     :with => /^d .?d{0,2}$/
  

Ответ №3:

Основываясь на ответе @Bitterzoet, но все же выполняя его проверку (с помощью validate метода):

 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
  

Ответ №4:

Почему вы не массируете входные данные после их получения? На мой взгляд, вы должны сами округлить его до двух десятичных знаков и не позволять пользователю беспокоиться об этом.

Rails предлагает round_with_precision, поэтому простой вызов .round(2) в вашем float округлит его до 2 десятичных знаков.

Ответ №5:

Класс sprintf Ruby предоставляет возможность указывать количество десятичных знаков для отображения. например. В приведенном ниже примере я получаю средние оценки трека и гарантирую, что среднее значение округлено до 1 знака после запятой.

 sprintf("%.1f",track.ratings.average('rating'))