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:
:decimalsẽ được sử dụng BigDecimalđể giải quyết rất nhiều vấn đề.
precisionvà scalenê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: 8và scale: 2cung cấp cho bạn 999,999.99số 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_currencynhư @molf và @facundofarias đề xuất.
Để chơi với number_to_currencyhelper trong Rails console, gửi một cuộc gọi đến ActiveSupportcủa NumberHelperlớ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 optionscủ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 Itemmô 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_currencybên trong một công cụ kiểm soát (chú ý negative_formattù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.