ruby-on-rails ruby rails - Quelle est la meilleure méthode de gestion de la monnaie / argent?
Voici une approche fine et simple qui exploite compose_of (une partie d'ActiveRecord, en utilisant le pattern ValueObject) et la gemme Money
Tu auras besoin
- The Money gem (version 4.1.0)
- Un modèle, par exemple
Product
- Une colonne
integer
dans votre modèle (et base de données), par exemple:price
Ecrivez ceci dans votre fichier product.rb
:
class Product > ActiveRecord::Base
composed_of :price,
:class_name => 'Money',
:mapping => %w(price cents),
:converter => Proc.new { |value| Money.new(value) }
# ...
Ce que vous aurez:
- Sans aucun changement supplémentaire, tous vos formulaires afficheront des dollars et des cents, mais la représentation interne ne représente encore que quelques cents. Les formulaires accepteront des valeurs comme "$ 12,034.95" et le convertiront pour vous. Il n'est pas nécessaire d'ajouter des gestionnaires ou des attributs supplémentaires à votre modèle, ou des aides à votre vue.
-
product.price = "$12.00"
convertit automatiquement à la classe Money -
product.price.to_s
affiche un nombre au format décimal ("1234.00") -
product.price.format
affiche une chaîne correctement formatée pour la devise - Si vous avez besoin d'envoyer des cents (à une passerelle de paiement qui veut des centimes),
product.price.cents.to_s
- Conversion de devises gratuite
Je travaille sur un système de panier d'achat très basique.
J'ai un items
table qui a un price
de colonne de type integer
.
J'ai des difficultés à afficher la valeur du prix dans mes vues pour les prix qui comprennent à la fois les euros et les cents. Suis-je en train de manquer quelque chose d'évident en ce qui concerne la gestion de la monnaie dans le cadre de Rails?
Utilisez la rails-money . Il gère bien l'argent et les devises dans votre modèle et a également un tas d'aides pour formater vos prix.
Définitivement des integers .
Et même si BigDecimal existe techniquement, 1.5
vous donnera toujours un Float pur en Ruby.
Je l'utilise de cette façon:
number_to_currency(amount, unit: '€', precision: 2, format: "%u %n")
Bien sûr que le symbole monétaire, la précision, le format et ainsi de suite dépend de chaque devise.
Vous pouvez passer certaines options à number_to_currency
(une aide de vue Rails 4 standard):
number_to_currency(12.0, :precision => 2)
# => "$12.00"
Publié par Dylan Markow
Code simple pour Ruby & Rails
<%= number_to_currency(1234567890.50) %>
OUT PUT => $1,234,567,890.50