Apenas uma pequena atualização e uma coesão de todas as respostas para alguns aspirantes a juniores / iniciantes no desenvolvimento do RoR que certamente virão aqui para algumas explicações.
Trabalhando com dinheiro
Use :decimal
para armazenar dinheiro no banco de dados, como o @molf sugeriu (e o que minha empresa usa como padrão-ouro ao trabalhar com dinheiro).
# 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
Alguns pontos:
:decimal
será usado como o BigDecimal
que resolve muitos problemas.
precision
e scale
deve ser ajustado, dependendo do que você está representando
Se você trabalha com recebimento e envio de pagamentos precision: 8
e scale: 2
oferece 999,999.99
o valor mais alto, o que é bom em 90% dos casos.
Se você precisar representar o valor de uma propriedade ou carro raro, use um valor mais alto precision
.
Se você trabalha com coordenadas (longitude e latitude), certamente precisará de uma maior scale
.
Como gerar uma migração
Para gerar a migração com o conteúdo acima, execute no terminal:
bin/rails g migration AddPriceToItems price:decimal{8-2}
ou
bin/rails g migration AddPriceToItems 'price:decimal{5,2}'
conforme explicado nesta postagem do blog .
Formatação de moeda
Dê um beijo de despedida nas bibliotecas extras e use ajudantes internos. Use number_to_currency
como @molf e @facundofarias sugeridos.
Para jogar com number_to_currency
ajudante no console do Rails, enviar uma chamada para o ActiveSupport
's NumberHelper
classe, a fim de acessar o ajudante.
Por exemplo:
ActiveSupport::NumberHelper.number_to_currency(2_500_000.61, unit: '€', precision: 2, separator: ',', delimiter: '', format: "%n%u")
dá a seguinte saída
2500000,61€
Verifique o outro auxiliar options
de number_to_currency .
Onde colocá-lo
Você pode colocá-lo em um auxiliar de aplicativo e usá-lo dentro de visualizações para qualquer quantia.
module ApplicationHelper
def format_currency(amount)
number_to_currency(amount, unit: '€', precision: 2, separator: ',', delimiter: '', format: "%n%u")
end
end
Ou você pode colocá-lo no Item
modelo como um método de instância e chamá-lo onde precisar formatar o preço (em visualizações ou auxiliares).
class Item < ActiveRecord::Base
def format_price
number_to_currency(price, unit: '€', precision: 2, separator: ',', delimiter: '', format: "%n%u")
end
end
E, um exemplo de como eu uso o number_to_currency
controlador interno (observe a negative_format
opção usada para representar reembolsos)
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)
é uma escolha popular verificar isso também verificar aqui Formatos Mundo moeda para decidir quantos lugares para uso decimal, esperança ajuda.