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 :decimal
untuk 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:
:decimal
akan digunakan sebagai BigDecimal
yang memecahkan banyak masalah.
precision
dan scale
harus disesuaikan, tergantung pada apa yang Anda wakili
Jika Anda bekerja dengan menerima dan mengirim pembayaran, precision: 8
dan scale: 2
memberi Anda 999,999.99
sebagai 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_currency
pembantu 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 options
dari 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 Item
model 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_currency
dalam contrroler (perhatikan negative_format
opsi, 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.