2010-09-28 18 views
5

MongoID ile Money ile nasıl çalışmalıyım? BigDecimal olarak yapılandırmalı mıyım? Raylar seviyesinde mi? ActiveRecord için Para adında bir şeyimiz var, ancak AFAIK sadece ARmongoid para gösterimi

+0

Para nedir? – shingara

+0

ondalık, int, yüzer ... – luckytaxi

+0

dm haklı. Parayı temsil etmek için kayan nokta sayılarını asla kullanmayın (yüzer, çiftler gibi). Bu çok amada edecek. Temsili sırasında senleri kaybedeceksin. Örneğin 10.2, 10.19999 (9) gibi temsil edilebilir. Yuvarlama ve farklı aritmetik işlemler sırasında artan hata alırsınız. [Neden para birimini temsil etmek için çift kullanmayın] (http://stackoverflow.com/questions/3730019/why-not-use-double-or-float-to-represent-currency/3730040#3730040) – Dao

cevap

3

MongoDB çeşitli BSON veri türlerini (int, long int, double) depolar. Parayı sent olarak (ABD dolarıysa) depolamanızı ve uzun int türünü kullanmanızı öneririm. Buna da rastladım

7

Maalesef Mongodb'daki BigDecimal mağazaları bir dizgedir, bu yüzden bir float veya int gibi toplamı, sıralama, vb.

Tamsayı muhtemelen soyut kendisine biraz para gem kullanarak, sent değer saklamak gitmek için yol olarak görünmektedir: https://github.com/RubyMoney/money

Mongo Öyle olduğunu düşünüyorum en modern makinelerde 64 bit kullanarak int depolayan sentlerde bile daha büyük bir miktara ihtiyaç duyma riski fazla değildir. ,9,223,372,036,854,775,808 ve 9,223,372,036,854,775,807 sent arasında saklayabileceğiniz gibi görünüyor, bu yüzden min/max değerini dolar cinsinden almak için iki ondalık basamak çıkar.

http://en.wikipedia.org/wiki/Integer_(computer_science)

2

Eğer para mücevherden hoşlanıyorsanız, Para tipi olarak saklayabilirsiniz.

Bir örnek: Bir dizi olarak para saklayan https://gist.github.com/michaelkoper/5007636

[sent, para birimi]

class Product 
    include Mongoid::Document 

    field :price, type: Money 
end 

product = Product.new(:price => Money.new(1000, 'EUR')) 
product.price.format 
# => "€10.00"