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).
# 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
Quelques points:
Comment générer une migration
Pour générer la migration avec le contenu ci-dessus, exécutez dans le terminal:
bin/rails g migration AddPriceToItems price:decimal{8-2}
ou
bin/rails g migration AddPriceToItems 'price:decimal{5,2}'
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 à la ActiveSupport
de NumberHelper
classe afin d'accéder à l'aide.
Par exemple:
ActiveSupport::NumberHelper.number_to_currency(2_500_000.61, unit: '€', precision: 2, separator: ',', delimiter: '', format: "%n%u")
donne la sortie suivante
2500000,61€
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.
module ApplicationHelper
def format_currency(amount)
number_to_currency(amount, unit: '€', precision: 2, separator: ',', delimiter: '', format: "%n%u")
end
end
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).
class Item < ActiveRecord::Base
def format_price
number_to_currency(price, unit: '€', precision: 2, separator: ',', delimiter: '', format: "%n%u")
end
end
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)
def refund_information
amount_formatted =
ActionController::Base.helpers.number_to_currency(@refund.amount, negative_format: '(%u%n)')
{
# ...
amount_formatted: amount_formatted,
# ...
}
end
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.