Chỉ cần một bản cập nhật nhỏ và sự gắn kết của tất cả các câu trả lời cho một số đàn em / người mới bắt đầu tham vọng phát triển RoR chắc chắn sẽ đến đây để giải thích.
Làm việc với tiền
Sử dụng :decimal
để lưu trữ tiền trong DB, như @molf đề xuất (và những gì công ty tôi sử dụng làm tiêu chuẩn vàng khi làm việc với tiền).
# 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
Vài điểm:
:decimal
sẽ được sử dụng BigDecimal
để giải quyết rất nhiều vấn đề.
precision
và scale
nên được điều chỉnh, tùy thuộc vào những gì bạn đang đại diện
Nếu bạn làm việc với việc nhận và gửi thanh toán, precision: 8
và scale: 2
cung cấp cho bạn 999,999.99
số tiền cao nhất, sẽ ổn trong 90% trường hợp.
Nếu bạn cần đại diện cho giá trị của một tài sản hoặc một chiếc xe hiếm, bạn nên sử dụng cao hơn precision
.
Nếu bạn làm việc với tọa độ (kinh độ và vĩ độ), bạn chắc chắn sẽ cần cao hơn scale
.
Cách tạo di chuyển
Để tạo di chuyển với nội dung trên, hãy chạy trong thiết bị đầu cuối:
bin/rails g migration AddPriceToItems price:decimal{8-2}
hoặc là
bin/rails g migration AddPriceToItems 'price:decimal{5,2}'
như được giải thích trong bài viết trên blog này .
Định dạng tiền tệ
HỎI các thư viện bổ sung tạm biệt và sử dụng các trợ giúp tích hợp. Sử dụng number_to_currency
như @molf và @facundofarias đề xuất.
Để chơi với number_to_currency
helper trong Rails console, gửi một cuộc gọi đến ActiveSupport
của NumberHelper
lớp để truy cập vào các helper.
Ví dụ:
ActiveSupport::NumberHelper.number_to_currency(2_500_000.61, unit: '€', precision: 2, separator: ',', delimiter: '', format: "%n%u")
đưa ra đầu ra sau
2500000,61€
Kiểm tra cái khác options
của trình trợ giúp number_to_currency .
Đặt nó ở đâu
Bạn có thể đặt nó trong một trình trợ giúp ứng dụng và sử dụng nó trong các khung nhìn với bất kỳ số tiền nào.
module ApplicationHelper
def format_currency(amount)
number_to_currency(amount, unit: '€', precision: 2, separator: ',', delimiter: '', format: "%n%u")
end
end
Hoặc bạn có thể đặt nó trong Item
mô hình như một phương thức ví dụ và gọi nó ở nơi bạn cần định dạng giá (trong chế độ xem hoặc người trợ giúp).
class Item < ActiveRecord::Base
def format_price
number_to_currency(price, unit: '€', precision: 2, separator: ',', delimiter: '', format: "%n%u")
end
end
Và, một ví dụ về cách tôi sử dụng number_to_currency
bên trong một công cụ kiểm soát (chú ý negative_format
tùy chọn, được sử dụng để thể hiện khoản hoàn trả)
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)
là một lựa chọn phổ biến kiểm tra này cũng kiểm tra ở đây Formats tệ thế giới để quyết định có bao nhiêu nơi để sử dụng số thập phân, hy vọng giúp.