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