2016-07-22 3 views
1

У меня есть модель pieces в моем приложении для рельсов, и каждая часть имеет десятичный знак, который называется :price. Я хочу подтвердить, что эта цена составляет два десятичных знака, больше 0, и составляет менее миллиона долларов. Я просмотрел многочисленные источники переполнения стека, и всякий раз, когда я набираю десятичное число для этих валидаций, например, 4.99, цена становится 4.990000000000000213162820728030055761. Это произошло во всех проверках, которые я просмотрел. Это потому, что мне нужно указать мою точность для десятичной дроби в моей базе данных? Как я могу это исправить?Проверка цены на Rails 4

Моя текущая проверка:

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

Спасибо, ребята!

ответ

3

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

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

это даст вам в общей сложности 8 цифр, с 2 знака после запятой.

О проверке,
Если вы хотите, чтобы :price всегда должны иметь два знака после запятой (т.е. 4,99), вы можете попробовать это,

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

Если вы хотите, чтобы :price должен иметь максимум два десятичное или меньше (то есть: 4, 4,9, 4,99), вы можете попробовать это,

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

или, если вы не хотите, чтобы проверить точность и просто хотите, чтобы округлить точность, прежде чем сохранить его в базу данных вы с использование round_with_precision.

0

Вы должны установить его в базе данных. Например, в миграции:

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

0

Если вы видите, что в ваших значениях добавлены дополнительные номера, вероятно, что ваш столбец задан как тип с плавающей запятой. Если вы работаете с долларовыми значениями , не используйте числа с плавающей запятой. Ответ М. Карим в противном случае.

Смежные вопросы