Hanya sedikit pembaruan dan kohesi dari semua jawaban untuk beberapa calon junior / pemula dalam pengembangan RoR yang pasti akan datang ke sini untuk beberapa penjelasan.
Bekerja dengan uang
Gunakan :decimaluntuk menyimpan uang di DB, seperti yang disarankan @molf (dan apa yang digunakan perusahaan saya sebagai standar emas ketika bekerja dengan uang).
# 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
Beberapa poin:
:decimalakan digunakan sebagai BigDecimalyang memecahkan banyak masalah.
precisiondan scaleharus disesuaikan, tergantung pada apa yang Anda wakili
Jika Anda bekerja dengan menerima dan mengirim pembayaran, precision: 8dan scale: 2memberi Anda 999,999.99sebagai jumlah tertinggi, yang berlaku untuk 90% kasus.
Jika Anda perlu mewakili nilai properti atau mobil langka, Anda harus menggunakan yang lebih tinggi precision.
Jika Anda bekerja dengan koordinat (bujur dan lintang), Anda pasti membutuhkan yang lebih tinggi scale.
Cara menghasilkan migrasi
Untuk menghasilkan migrasi dengan konten di atas, jalankan di terminal:
bin/rails g migration AddPriceToItems price:decimal{8-2}
atau
bin/rails g migration AddPriceToItems 'price:decimal{5,2}'
seperti yang dijelaskan di blog ini posting .
Pemformatan mata uang
KISS selamat tinggal di perpustakaan tambahan dan gunakan bantuan bawaan. Menggunakannumber_to_currency seperti yang disarankan @molf dan @facundofarias.
Untuk bermain dengan number_to_currencypembantu di konsol Rails, kirim panggilan ke ActiveSupport'sNumberHelper kelas untuk mengakses pembantu.
Sebagai contoh:
ActiveSupport::NumberHelper.number_to_currency(2_500_000.61, unit: '€', precision: 2, separator: ',', delimiter: '', format: "%n%u")
memberikan hasil sebagai berikut
2500000,61€
Periksa lain optionsdari number_to_currency pembantu.
Di mana harus meletakkannya
Anda dapat memasukkannya ke dalam pembantu aplikasi dan menggunakannya di dalam tampilan berapa pun jumlahnya.
module ApplicationHelper
def format_currency(amount)
number_to_currency(amount, unit: '€', precision: 2, separator: ',', delimiter: '', format: "%n%u")
end
end
Atau Anda dapat memasukkannya ke dalam Itemmodel sebagai metode instan, dan menyebutnya di mana Anda perlu memformat harga (dalam tampilan atau bantuan).
class Item < ActiveRecord::Base
def format_price
number_to_currency(price, unit: '€', precision: 2, separator: ',', delimiter: '', format: "%n%u")
end
end
Dan, contoh bagaimana saya menggunakan bagian number_to_currencydalam contrroler (perhatikan negative_formatopsi, digunakan untuk mewakili pengembalian uang)
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)adalah pilihan populer periksa ini juga periksa di sini Format Mata Uang Dunia untuk memutuskan berapa banyak tempat desimal untuk digunakan, harap membantu.