Câu trả lời:
Bạn muốn number_with_delimiter
phương pháp. Ví dụ:
<%= number_with_delimiter(@number, :delimiter => ',') %>
Ngoài ra, bạn có thể sử dụng number_with_precision
phương pháp để đảm bảo rằng số luôn được hiển thị với hai vị trí chính xác thập phân:
<%= number_with_precision(@number, :precision => 2, :delimiter => ',') %>
number_with_delimiter
quá phức tạp và thực sự chậm, với độ sâu của các ngăn xếp cuộc gọi. Nó sử dụng i18n
để có thể định dạng bất kỳ số nào được biết đến bởi các nền văn minh nhân loại và ngoài trái đất (hoặc có thể chỉ để chọn ,
hoặc .
cho các chữ số thập phân, ngay cả khi bạn chỉ định nó là đối số). Nó phân bổ hàng ngàn đối tượng (vì vậy các mẫu hiệu suất của nó rất phức tạp và khó cấu hình). Cân nhắc chỉ sử dụng regexps nếu bạn không cần hỗ trợ các cách khác nhau để định dạng số tùy theo ngôn ngữ.
Đối với bất cứ ai không sử dụng đường ray:
number.to_s.reverse.gsub(/(\d{3})(?=\d)/, '\\1,').reverse
number.to_s.reverse.scan(/(?:\d*\.)?\d{1,3}-?/).join(',').reverse
\1
đủ sao? Cảm ơn.
Cách trực tiếp để làm điều này, có hoặc không có Rails , là:
require 'active_support/core_ext/numeric/conversions'
12345.to_s(:delimited) # => "12,345"
12345.6789.to_s(:delimited) # => "12,345.6789"
Để biết thêm tùy chọn, hãy xem Tiện ích mở rộng lõi hỗ trợ hoạt động - Số - Định dạng .
ActiveSupport::NumberHelper.number_to_delimited
là tốt. Câu trả lời này xứng đáng nhận được nhiều sự ủng hộ hơn.
Có, sử dụng NumberHelper . Phương thức bạn đang tìm kiếm là number_with_d Friiter .
number_with_delimiter(98765432.98, :delimiter => ",", :separator => ".")
# => 98,765,432.98
Nếu bạn muốn thêm dấu phẩy ngoài chế độ xem và bạn không muốn bao gồm một số mô-đun, bạn có thể sử dụng phương thức number_to_delrict (phiên bản rails> = 4.02). Ví dụ:
#inside anywhere
ActiveSupport::NumberHelper.number_to_delimited(1000000) # => "1,000,000"
Nếu bạn đang làm điều đó rất nhiều nhưng cũng là FYI vì nó không được ngụ ý ở trên, Rails có mặc định hợp lý cho number_with_delimiter
phương pháp.
#inside controller or view
number_with_delimiter(2444323.4)
#=> 2,444,323.30
#inside console
helper.number_with_delimiter(233423)
#=> 233,423
Không cần cung cấp giá trị dấu phân cách nếu bạn đang thực hiện theo cách điển hình nhất.
Một cách tốt hơn cho những người không sử dụng đường ray xử lý số thập phân:
parts = number.to_s.split('.')
parts[0].gsub!(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1,")
parts.join('.')
Nếu bạn muốn một dấu phân cách khác, hãy thay đổi ',' cuối cùng trong biểu thức chính quy.
Đối với tiền thưởng, đây là cách regex hoạt động:
\\1
. \\1
trở thành \1
khi được đánh giá phù hợp với nhóm chụp đầu tiên trong regex. Trong regex đó là (\d)
.(\d)(?=(\d\d\d)+)
phù hợp với một chữ số theo sau bởi 1 hoặc nhiều nhóm 3 chữ số. Nhóm parens đầu tiên là \1
nhóm bắt giữ của chúng tôi , nhóm thứ hai sẽ là \2
. Nếu chúng ta chỉ để nó ở đó, chúng ta sẽ nhận được:
123456.gsub!(/(\d)(?=(\d\d\d)+)/, "\\1,") #=> 1,2,3,456
Điều này là do 1234 trận đấu, 2345 trận đấu và 3456 trận đấu nên chúng ta đặt dấu phẩy sau 1, 2 và 3.(\d)(?=(\d\d\d)+(?!\d))
nghĩa là khớp với một chữ số theo sau 3 chữ số không theo sau một chữ số. Lý do tại sao điều này hoạt động là gsub sẽ tiếp tục thay thế những thứ phù hợp với chuỗi. Nếu chúng tôi chỉ thay thế trận đấu đầu tiên thì với một số như 123456789, chúng tôi sẽ nhận được 123456,789. Vì 123456,789 vẫn phù hợp với biểu thức chính quy của chúng tôi, chúng tôi nhận được 123,456,789.Đây là nơi tôi nhận được mã: https://github.com/rails/rails/blob/master/activesupport/lib/active_support/number_helper.rb#L298-L300
Và đây là nơi tôi đã học về những gì đang diễn ra trong regex đó: http://www.tutorialspoint.com/ruby/ruby_THER_expressions.htmlm
{{ value | round | replace: "(\d)(?=(\d\d\d)+(?!\d))", "$1," | prepend: "$" }}
Một giải pháp khác không sử dụng Helpers: định dạng với 2 chữ số thập phân, sau đó thay thế. bởi,
puts(("%.2f" % 2.5666).gsub('.',','))
>> 2,57
Bạn có thể sử dụng các phương pháp từ ActiveSupport
Ví dụ:
ActiveSupport::NumberHelper::number_to_currency(10000.1234,{precision: 2,unit: ''})
def add_commas(numstring)
correct_idxs = (1..100).to_a.select{|n| n % 6 == 0}.map{|n| n - 1}
numstring.reverse.chars.join(",").chars.select.with_index{|x, i| i.even? || correct_idxs.include?(i)}.join.reverse
end
Đây là cách của tôi trong ruby
Chỉnh sửa bổ sung: Về cơ bản, nó thêm tất cả dấu phẩy vào giữa các số và chỉ chọn những dấu trong đó chỉ mục + 1% 6
Tôi cho rằng dấu phẩy lên tới 100 là ổn nhưng nếu bạn muốn một số siêu dài chỉ cần tạo 100 số cao hơn
cú pháp mới
number_with_delimeter(@number, delimeter: ",")
Nếu bạn muốn người dùng phân định tiền để kiếm tiền thì bạn có thể làm
number_to_currency(@number)
này sẽ bổ sung thêm $
quá. Nếu bạn đang sử dụng money
đá quý thì bạn có thể làm
Money.new(@number,"USD").format
Điều này cũng sẽ đặt $
.
Sau đây thực hiện thủ thuật cho cả dấu phân cách và độ chính xác ( API ref ).
ActiveSupport::NumberHelper.number_to_rounded(1234.532, delimiter: ',', precision: 1)
(hoặc từ lượt xem chỉ number_to_rounded
, không cần hậu tố)
HTH
ActionView::Helpers::NumberHelper
trong mô-đun.