2016-07-22 104 views
1

我在我的Rails應用程序中有一個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

如果您看到您的值正在附加數字,則可能發生的情況是您的列被設置爲浮點類型。如果您使用美元值,請不要使用浮點數。卡里姆先生的回答很好,否則。