Solo un piccolo aggiornamento e una coesione di tutte le risposte per alcuni aspiranti junior / principianti nello sviluppo del RoR che verranno sicuramente qui per alcune spiegazioni.
Lavorare con i soldi
Utilizzalo :decimal
per archiviare denaro nel DB, come suggerito da @molf (e ciò che la mia azienda utilizza come standard aureo quando lavora con denaro).
# 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
Pochi punti:
:decimal
verrà utilizzato come ciò BigDecimal
che risolve molti problemi.
precision
e scale
dovrebbe essere regolato, a seconda di ciò che stai rappresentando
Se lavori con la ricezione e l'invio di pagamenti precision: 8
e scale: 2
ti offre 999,999.99
l'importo più elevato, il che va bene nel 90% dei casi.
Se devi rappresentare il valore di una proprietà o di un'auto rara, dovresti utilizzare un valore superiore precision
.
Se lavori con le coordinate (longitudine e latitudine), avrai sicuramente bisogno di un valore superiore scale
.
Come generare una migrazione
Per generare la migrazione con il contenuto sopra, esegui nel terminale:
bin/rails g migration AddPriceToItems price:decimal{8-2}
o
bin/rails g migration AddPriceToItems 'price:decimal{5,2}'
come spiegato in questo post sul blog .
Formattazione della valuta
BACIO addio alle biblioteche extra e usa gli helper integrati. Utilizzare number_to_currency
come suggerito da @molf e @facundofarias.
Per giocare con l' number_to_currency
helper nella console di Rails, invia una chiamata alActiveSupport
's NumberHelper
di classe al fine di accedere al aiutante.
Per esempio:
ActiveSupport::NumberHelper.number_to_currency(2_500_000.61, unit: '€', precision: 2, separator: ',', delimiter: '', format: "%n%u")
fornisce il seguente output
2500000,61€
Controlla l'altro options
di number_to_currency aiutante.
Dove metterlo
È possibile inserirlo in un supporto dell'applicazione e utilizzarlo all'interno delle viste per qualsiasi importo.
module ApplicationHelper
def format_currency(amount)
number_to_currency(amount, unit: '€', precision: 2, separator: ',', delimiter: '', format: "%n%u")
end
end
Oppure puoi inserirlo nel Item
modello come metodo di istanza e chiamarlo dove è necessario formattare il prezzo (in viste o helper).
class Item < ActiveRecord::Base
def format_price
number_to_currency(price, unit: '€', precision: 2, separator: ',', delimiter: '', format: "%n%u")
end
end
E, un esempio di come uso l' number_to_currency
interno di un dispositivo di controllo (nota l' negative_format
opzione, utilizzata per rappresentare i rimborsi)
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)
è una scelta popolare controlla questo controlla anche qui i formati di valuta mondiale per decidere quanti posti decimali usare, la speranza aiuta.