Je travaille sur un système de panier d'achat très basique.
J'ai une table items
qui a une colonne price
de type integer
.
J'ai du mal à afficher la valeur du prix dans mes vues pour les prix qui incluent à la fois les euros et les cents. Suis-je en train de manquer quelque chose d'évident en ce qui concerne la gestion des devises dans le cadre Rails?
ruby-on-rails
ruby
currency
Barry Gallagher
la source
la source
DECIMAL(19, 4)
c'est un choix populaire, cochez cette case, vérifiez également ici Formats de devise mondiale pour décider du nombre de décimales à utiliser, espérons que cela aide.Réponses:
Vous voudrez probablement utiliser un
DECIMAL
type dans votre base de données. Dans votre migration, faites quelque chose comme ceci:Dans Rails, le
:decimal
type est renvoyé en tant queBigDecimal
, ce qui est idéal pour le calcul du prix.Si vous insistez pour utiliser des entiers, vous devrez convertir manuellement vers et depuis
BigDecimal
s partout, ce qui deviendra probablement juste une douleur.Comme indiqué par mcl, pour imprimer le prix, utilisez:
la source
Voici une approche fine et simple qui exploite
composed_of
(une partie d'ActiveRecord, en utilisant le modèle ValueObject) et la gemme MoneyTu auras besoin
Product
integer
colonne dans votre modèle (et base de données), par exemple:price
Écrivez ceci dans votre
product.rb
dossier:Ce que vous obtiendrez:
product.price = "$12.00"
convertit automatiquement en classe Moneyproduct.price.to_s
affiche un nombre au format décimal ("1234.00")product.price.format
affiche une chaîne correctement formatée pour la deviseproduct.price.cents.to_s
la source
composed_of
ici, vous trouverez plus de détails à ce sujet ainsi qu'une implémentation alternative.La pratique courante pour la gestion des devises consiste à utiliser le type décimal. Voici un exemple simple de "Développement Web Agile avec Rails"
Cela vous permettra de gérer des prix de -999 999,99 à 999 999,99.
Vous pouvez également inclure une validation dans vos articles comme
pour vérifier vos valeurs.
la source
Si vous utilisez Postgres (et puisque nous sommes en 2017 maintenant), vous voudrez peut-être
:money
essayer leur type de colonne.la source
Utilisez la gemme de l'argent-rails . Il gère bien l'argent et les devises dans votre modèle et dispose également d'un tas d'aides pour formater vos prix.
la source
Juste une petite mise à jour et une cohésion de toutes les réponses pour certains aspirants juniors / débutants en développement RoR qui viendront sûrement ici pour quelques explications.
Travailler avec de l'argent
Utilisez-le
:decimal
pour stocker de l'argent dans la base de données, comme l'a suggéré @molf (et ce que mon entreprise utilise comme référence pour travailler avec de l'argent).Quelques points:
:decimal
va être utilisé commeBigDecimal
ce qui résout beaucoup de problèmes.precision
etscale
doit être ajusté en fonction de ce que vous représentezSi vous travaillez avec la réception et l'envoi de paiements,
precision: 8
etscale: 2
vous donne999,999.99
le montant le plus élevé, ce qui est bien dans 90% des cas.Si vous devez représenter la valeur d'une propriété ou d'une voiture rare, vous devez utiliser une valeur supérieure
precision
.Si vous travaillez avec des coordonnées (longitude et latitude), vous aurez sûrement besoin d'un plus haut
scale
.Comment générer une migration
Pour générer la migration avec le contenu ci-dessus, exécutez dans le terminal:
ou
comme expliqué dans ce billet de blog .
Formatage des devises
KISS les bibliothèques supplémentaires au revoir et utilisez des aides intégrées. Utilisez
number_to_currency
comme @molf et @facundofarias suggéré.Pour jouer avec
number_to_currency
aide dans la console Rails, envoyer un appel à laActiveSupport
deNumberHelper
classe afin d'accéder à l'aide.Par exemple:
donne la sortie suivante
Vérifiez l'autre
options
de l' assistant number_to_currency .Où le mettre
Vous pouvez le mettre dans une application d'assistance et l'utiliser à l'intérieur des vues pour n'importe quel montant.
Ou vous pouvez le mettre dans le
Item
modèle en tant que méthode d'instance et l'appeler là où vous devez formater le prix (dans les vues ou les aides).Et, un exemple comment j'utilise l'
number_to_currency
intérieur d'un contrôleur (remarquez l'negative_format
option, utilisée pour représenter les remboursements)la source
À l'aide d' attributs virtuels (lien vers Railscast révisé (payant)), vous pouvez stocker vos price_in_cents dans une colonne entière et ajouter un attribut virtuel price_in_dollars dans votre modèle de produit en tant que getter et setter.
Source: RailsCasts # 016: Attributs virtuels : attributs virtuels sont un moyen propre pour ajouter des champs de formulaire qui ne correspondent pas directement à la base de données. Ici, je montre comment gérer les validations, les associations, etc.
la source
Certainement des entiers .
Et même si BigDecimal existe techniquement, vous
1.5
aurez toujours un flottant pur en Ruby.la source
Si quelqu'un utilise Sequel, la migration ressemblerait à ceci:
en quelque sorte Sequel ignore: précision et: échelle
(Version de la suite: suite (3.39.0, 3.38.0))
la source
Mes API sous-jacentes utilisaient toutes des cents pour représenter l'argent, et je ne voulais pas changer cela. Je ne travaillais pas non plus avec de grosses sommes d'argent. Je viens donc de mettre cela dans une méthode d'aide:
Cela convertit l'entier en une chaîne avec au moins trois chiffres (en ajoutant des zéros au début si nécessaire), puis insère une virgule décimale avant les deux derniers chiffres, sans jamais utiliser a
Float
. De là, vous pouvez ajouter les symboles monétaires appropriés à votre cas d'utilisation.C'est définitivement rapide et sale, mais parfois c'est très bien!
la source
Je l'utilise de cette façon:
Bien sûr, le symbole monétaire, la précision, le format, etc. dépendent de chaque devise.
la source
Vous pouvez transmettre certaines options à
number_to_currency
(un assistant de vue Rails 4 standard):Tel que publié par Dylan Markow
la source
Code simple pour Ruby & Rails
la source