處理貨幣/貨幣的最佳方法是什麼?

我正在研究一個很是基本的購物車系統。 git

我有一個表items ,其列priceinteger類型。 數據庫

我沒法在包括歐元和美分在內的價格中顯示價格值。 就Rails框架中的處理貨幣而言,我是否遺漏了一些明顯的東西? app


#1樓

處理貨幣的經常使用作法是使用十進制類型。 如下是「使用Rails進行敏捷Web開發」的簡單示例 框架

add_column :products, :price, :decimal, :precision => 8, :scale => 2

這將容許您處理從-999,999.99到999,999.99的價格
您可能還但願在項目中包含驗證 spa

def validate 
  errors.add(:price, "should be at least 0.01") if price.nil? || price < 0.01 
end

理智 - 檢查你的價值觀。 code


#2樓

您可能但願在數據庫中使用DECIMAL類型。 在遷移中,執行如下操做: ci

# precision is the total number of digits
# scale is the number of digits to the right of the decimal point
add_column :items, :price, :decimal, :precision => 8, :scale => 2

在Rails中, :decimal類型做爲BigDecimal返回,這對於價格計算頗有用。 開發

若是你堅持使用整數,你將不得不手動轉換到BigDecimal的全部地方,這可能只是一個痛苦。 get

正如mcl所指出的,要打印價格,請使用: 產品

number_to_currency(price, :unit => "€")
#=> €1,234.01

#3樓

絕對是整數

即便BigDecimal在技術上存在, 1.5仍將爲您提供Ruby中的純Float。


#4樓

使用虛擬屬性(連接到修訂(付費)Railscast),您能夠將price_in_cents存儲在整數列中,並在產品模型中添加虛擬屬性price_in_dollars做爲getter和setter。

# Add a price_in_cents integer column
$ rails g migration add_price_in_cents_to_products price_in_cents:integer

# Use virtual attributes in your Product model
# app/models/product.rb

def price_in_dollars
  price_in_cents.to_d/100 if price_in_cents
end

def price_in_dollars=(dollars)
  self.price_in_cents = dollars.to_d*100 if dollars.present?
end

來源: RailsCasts#016: 虛擬屬性虛擬屬性是添加不直接映射到數據庫的表單字段的簡潔方法。 在這裏,我將展現如何處理驗證,關聯等。


#5樓

若是有人使用續集,遷移將看起來像:

add_column :products, :price, "decimal(8,2)"

不知怎的,Sequel忽略了:精確度和:規模

(續集版本:續集(3.39.0,3.38.0))

相關文章
相關標籤/搜索