Saya sedang mengerjakan sistem kereta belanja yang sangat mendasar.
Saya punya tabel items
yang memiliki kolom price
tipe integer
.
Saya mengalami masalah dalam menampilkan nilai harga dalam pandangan saya untuk harga yang mencakup Euro dan sen. Apakah saya kehilangan sesuatu yang jelas sejauh menyangkut mata uang dalam kerangka Rails?
ruby-on-rails
ruby
currency
Barry Gallagher
sumber
sumber
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.Jawaban:
Anda mungkin ingin menggunakan
DECIMAL
jenis dalam basis data Anda. Dalam migrasi Anda, lakukan sesuatu seperti ini:Di Rails,
:decimal
tipe dikembalikan sebagaiBigDecimal
, yang sangat bagus untuk perhitungan harga.Jika Anda bersikeras menggunakan bilangan bulat, Anda harus mengkonversi secara manual ke dan dari
BigDecimal
mana-mana, yang mungkin hanya akan menyusahkan.Seperti yang ditunjukkan oleh mcl, untuk mencetak harga, gunakan:
sumber
Inilah pendekatan yang bagus dan sederhana yang memanfaatkan
composed_of
(bagian dari ActiveRecord, menggunakan pola ValueObject) dan permata UangKamu akan membutuhkan
Product
integer
kolom dalam model Anda (dan database), misalnya:price
Tulis ini di
product.rb
file Anda :Apa yang akan Anda dapatkan:
product.price = "$12.00"
secara otomatis dikonversi ke kelas Uangproduct.price.to_s
menampilkan angka berformat desimal ("1234.00")product.price.format
menampilkan string yang diformat dengan benar untuk mata uangproduct.price.cents.to_s
sumber
composed_of
sini adalah lebih rinci tentang itu serta implementasi alternatif.Praktik umum untuk menangani mata uang adalah menggunakan tipe desimal. Berikut adalah contoh sederhana dari "Agile Web Development with Rails"
Ini akan memungkinkan Anda untuk menangani harga dari -999.999,99 hingga 999.999,99
Anda juga mungkin ingin menyertakan validasi dalam item Anda seperti
untuk kewarasan-periksa nilai-nilai Anda.
sumber
Jika Anda menggunakan Postgres (dan karena kami berada di tahun 2017 sekarang), Anda mungkin ingin memberikannya
:money
mencoba jenis kolomnya.sumber
Gunakan permata money-rails . Ini dengan baik menangani uang dan mata uang dalam model Anda dan juga memiliki banyak pembantu untuk memformat harga Anda.
sumber
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).Beberapa poin:
:decimal
akan digunakan sebagaiBigDecimal
yang memecahkan banyak masalah.precision
danscale
harus disesuaikan, tergantung pada apa yang Anda wakiliJika Anda bekerja dengan menerima dan mengirim pembayaran,
precision: 8
danscale: 2
memberi Anda999,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:
atau
seperti yang dijelaskan di blog ini posting .
Pemformatan mata uang
KISS selamat tinggal di perpustakaan tambahan dan gunakan bantuan bawaan. Menggunakan
number_to_currency
seperti yang disarankan @molf dan @facundofarias.Untuk bermain dengan
number_to_currency
pembantu di konsol Rails, kirim panggilan keActiveSupport
'sNumberHelper
kelas untuk mengakses pembantu.Sebagai contoh:
memberikan hasil sebagai berikut
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.
Atau Anda dapat memasukkannya ke dalam
Item
model sebagai metode instan, dan menyebutnya di mana Anda perlu memformat harga (dalam tampilan atau bantuan).Dan, contoh bagaimana saya menggunakan bagian
number_to_currency
dalam contrroler (perhatikannegative_format
opsi, digunakan untuk mewakili pengembalian uang)sumber
Menggunakan Atribut Virtual (Tautan ke Railscast yang direvisi (berbayar)) Anda dapat menyimpan price_in_cents Anda dalam kolom integer dan menambahkan atribut virtual price_in_dollars dalam model produk Anda sebagai pengambil dan penyetel.
Sumber: Railscasts # 016: Atribut Virtual : atribut Virtual adalah cara yang bersih untuk menambahkan kolom formulir yang tidak peta langsung ke database. Di sini saya menunjukkan cara menangani validasi, asosiasi, dan banyak lagi.
sumber
Bilangan bulat pasti .
Dan meskipun BigDecimal ada secara teknis
1.5
masih akan memberi Anda Float murni di Ruby.sumber
Jika seseorang menggunakan Sekuel migrasi akan terlihat seperti:
entah bagaimana Sequel mengabaikan: presisi dan: skala
(Versi Sekuel: sekuel (3.39.0, 3.38.0))
sumber
API dasar saya semuanya menggunakan sen untuk mewakili uang, dan saya tidak ingin mengubahnya. Saya juga tidak bekerja dengan banyak uang. Jadi saya hanya menempatkan ini dalam metode pembantu:
Itu mengubah bilangan bulat ke string dengan setidaknya tiga digit (menambahkan nol terkemuka jika perlu), lalu memasukkan titik desimal sebelum dua digit terakhir, tidak pernah menggunakan
Float
. Dari sana Anda dapat menambahkan simbol mata uang apa pun yang sesuai untuk kasus penggunaan Anda.Ini jelas cepat dan kotor, tetapi kadang-kadang itu tidak masalah!
sumber
Saya menggunakannya dengan cara ini:
Tentu saja simbol mata uang, ketepatan, format dan sebagainya tergantung pada setiap mata uang.
sumber
Anda dapat memberikan beberapa opsi ke
number_to_currency
(pembantu tampilan Rails 4 standar):Seperti yang diposting oleh Dylan Markow
sumber
Kode sederhana untuk Ruby & Rails
sumber