2010-09-28 13 views
5

Jak mam pracować z Money z MongoID? Czy powinienem skonfigurować go jako BigDecimal? A na poziomie szyn? Dla ActiveRecord mamy coś o nazwie Money, ale AFAIK obsługuje tylko ARreprezentacja pieniędzy w mongoidzie

+0

co to pieniądze? – shingara

+0

jak dziesiętne, int, pływające ... – luckytaxi

+0

dm ma rację. Nigdy nie używaj liczb zmiennoprzecinkowych do reprezentowania pieniędzy (takich jak spływy, duble). To sprawi, że wiele butthurt. Stracisz centy podczas reprezentacji. Na przykład 10.2 może być reprezentowany jak 10.19999 (9). Podczas zaokrąglania i różnych operacji arytmetycznych otrzymasz zwiększający się błąd. [Dlaczego nie używać podwójnego do reprezentowania waluty] (http://stackoverflow.com/questions/3730019/why-not-use-double-or-float-to-represent-currency/3730040#3730040) – Dao

Odpowiedz

3

MongoDB przechowuje numery w różnych typach danych BSON (int, long int, double). Zalecam przechowywanie pieniędzy jako centów (jeśli jest to waluta amerykańska) i używanie typu long int typu.

7

Wpadłem też na to. Niestety sklepy BigDecimal w Mongodb jako ciąg, więc nie pozwoli ci sumować, sortować, itp. Na nim jak float lub int.

Integer wydaje się być droga przechowywania wartości w centach, ewentualnie stosując gem pieniądze na abstrakcyjnym to kawałek: https://github.com/RubyMoney/money

Mongo przechowuje int przy użyciu 64 bitów na najnowocześniejszych maszynach Chyba tak jest nie ma dużego ryzyka, że ​​potrzebujemy większej kwoty nawet w centach. Wygląda na to, że możesz przechowywać między -2,223,372,036,854,775,808 i 9,223,372,036,854,775,807 centów, więc zdejmij dwie miejsca po przecinku, aby uzyskać wartość min/max w dolarach.

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

2

Jeśli podoba ci się ten klejnot, możesz go przechowywać jako pieniądze.

Przykład: https://gist.github.com/michaelkoper/5007636

Przechowuje pieniądze jako tablica [centów, waluty]

class Product 
    include Mongoid::Document 

    field :price, type: Money 
end 

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