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 :decimalpour 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_currencycomme @molf et @facundofarias suggéré.
Pour jouer avec number_to_currencyaide dans la console Rails, envoyer un appel à la ActiveSupportde NumberHelperclasse 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 optionsde 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 Itemmodè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_currencyintérieur d'un contrôleur (remarquez l' negative_formatoption, 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.