Solo una pequeña actualización y una cohesión de todas las respuestas para algunos aspirantes a junior / principiantes en el desarrollo de RoR que seguramente vendrán aquí para algunas explicaciones.
Trabajando con dinero
Utilice :decimal
para almacenar dinero en el PP, como @molf sugirió (y lo que mis usos de la empresa como un estándar de oro cuando se trabaja con dinero).
# 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
Pocos puntos:
:decimal
se usará para BigDecimal
resolver muchos problemas.
precision
y scale
debe ajustarse, según lo que esté representando
Si trabaja con recibir y enviar pagos, precision: 8
y scale: 2
le da 999,999.99
la cantidad más alta, que está bien en el 90% de los casos.
Si necesita representar el valor de una propiedad o un automóvil raro, debe usar uno más alto precision
.
Si trabaja con coordenadas (longitud y latitud), seguramente necesitará una más alta scale
.
Cómo generar una migración
Para generar la migración con el contenido anterior, ejecute en la terminal:
bin/rails g migration AddPriceToItems price:decimal{8-2}
o
bin/rails g migration AddPriceToItems 'price:decimal{5,2}'
como se explica en esta publicación de blog .
Formato de moneda
BESE las bibliotecas adicionales adiós y use ayudantes incorporados. Use number_to_currency
como @molf y @facundofarias sugirieron.
Para jugar con el number_to_currency
ayudante en la consola de Rails, envíe una llamada a la clase ActiveSupport
's NumberHelper
para acceder al ayudante.
Por ejemplo:
ActiveSupport::NumberHelper.number_to_currency(2_500_000.61, unit: '€', precision: 2, separator: ',', delimiter: '', format: "%n%u")
da el siguiente resultado
2500000,61€
Verifique el otro número de ayudante options
de número a moneda
Donde ponerlo
Puede ponerlo en una aplicación auxiliar y usarlo dentro de las vistas por cualquier cantidad.
module ApplicationHelper
def format_currency(amount)
number_to_currency(amount, unit: '€', precision: 2, separator: ',', delimiter: '', format: "%n%u")
end
end
O puede ponerlo en el Item
modelo como un método de instancia y llamarlo donde necesite formatear el precio (en vistas o ayudantes).
class Item < ActiveRecord::Base
def format_price
number_to_currency(price, unit: '€', precision: 2, separator: ',', delimiter: '', format: "%n%u")
end
end
Y, un ejemplo de cómo uso el number_to_currency
controlador interno (observe la negative_format
opción, utilizada 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)
es una opción popular, marque esto y marque aquí Formatos de moneda mundial para decidir cuántos decimales usar, la esperanza ayuda.