Jawaban:
Anda menginginkan number_with_delimitermetodenya. Sebagai contoh:
<%= number_with_delimiter(@number, :delimiter => ',') %>
Atau, Anda dapat menggunakan number_with_precisionmetode ini untuk memastikan bahwa angka selalu ditampilkan dengan dua tempat desimal presisi:
<%= number_with_precision(@number, :precision => 2, :delimiter => ',') %>
number_with_delimiterterlalu rumit dan sangat lambat, dengan kedalaman tumpukan panggilan yang sangat besar. Ini digunakan i18nuntuk dapat memformat angka yang dikenal manusia dan peradaban ekstraterestrial (atau mungkin hanya untuk memilih salah satu ,atau .untuk angka desimal, bahkan jika Anda menetapkannya sebagai argumen). Ini mengalokasikan ribuan objek (jadi pola kinerjanya kompleks dan sulit diprofilkan). Pertimbangkan hanya menggunakan regexps jika Anda tidak perlu mendukung berbagai cara untuk memformat angka tergantung pada lokal.
Bagi siapa pun yang tidak menggunakan rel:
number.to_s.reverse.gsub(/(\d{3})(?=\d)/, '\\1,').reverse
number.to_s.reverse.scan(/(?:\d*\.)?\d{1,3}-?/).join(',').reverse
\1cukup? Terima kasih.
Cara langsung untuk melakukan ini, dengan atau tanpa Rails , adalah:
require 'active_support/core_ext/numeric/conversions'
12345.to_s(:delimited) # => "12,345"
12345.6789.to_s(:delimited) # => "12,345.6789"
Untuk opsi lainnya, lihat Ekstensi Inti Dukungan Aktif - Pemformatan Numerik .
ActiveSupport::NumberHelper.number_to_delimitedjuga. Jawaban ini layak mendapat lebih banyak upvotes.
Ya, gunakan NumberHelper . Metode yang Anda cari adalah number_with_delimiter .
number_with_delimiter(98765432.98, :delimiter => ",", :separator => ".")
# => 98,765,432.98
Jika Anda ingin menambahkan koma di luar tampilan dan Anda tidak ingin menyertakan beberapa modul, Anda dapat menggunakan metode number_to_delimited (versi rel> = 4.02). Sebagai contoh:
#inside anywhere
ActiveSupport::NumberHelper.number_to_delimited(1000000) # => "1,000,000"
Jika Anda sering melakukannya tetapi juga FYI karena tidak tersirat di atas, Rails memiliki default yang masuk akal untuk number_with_delimitermetode ini.
#inside controller or view
number_with_delimiter(2444323.4)
#=> 2,444,323.30
#inside console
helper.number_with_delimiter(233423)
#=> 233,423
Tidak perlu memberikan nilai pembatas jika Anda melakukannya dengan cara yang paling khas.
Cara yang lebih baik bagi mereka yang tidak menggunakan rel yang menangani desimal:
parts = number.to_s.split('.')
parts[0].gsub!(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1,")
parts.join('.')
Jika Anda ingin pembatas yang berbeda, ubah ',' terakhir di regex.
Untuk bonus, ini adalah cara kerja regex:
\\1. \\1menjadi \1ketika dievaluasi yang cocok dengan kelompok tangkapan pertama di regex. Di regex ini yaitu(\d) .(\d)(?=(\d\d\d)+)cocok dengan digit diikuti oleh 1 atau lebih grup dengan 3 digit. Set parens pertama adalah \1grup tangkap kami , yang kedua adalah \2. Jika kita hanya membiarkannya saja maka kita akan mendapatkan:
123456.gsub!(/(\d)(?=(\d\d\d)+)/, "\\1,") #=> 1,2,3,456Ini karena 1234 pertandingan, 2345 pertandingan dan 3456 pertandingan jadi kami menempatkan koma setelah 1, 2, dan 3.(\d)(?=(\d\d\d)+(?!\d))berarti cocok dengan digit diikuti oleh 3 digit yang tidak diikuti oleh digit. Alasan mengapa ini berhasil adalah gsub akan terus mengganti hal-hal yang cocok dengan string. Jika kami hanya akan mengganti pertandingan pertama maka untuk nomor seperti 123456789 kami akan mendapatkan 123456.789. Karena 123456.789 masih cocok dengan regex kami, kami mendapatkan 123.456.789.Di sinilah saya mendapatkan kode: https://github.com/rails/rails/blob/master/activesupport/lib/active_support/number_helper.rb#L298-L300
Dan di sinilah saya belajar tentang apa yang terjadi di regex itu: http://www.tutorialspoint.com/ruby/ruby_regular_expressions.htm
{{ value | round | replace: "(\d)(?=(\d\d\d)+(?!\d))", "$1," | prepend: "$" }}
Solusi lain yang tidak menggunakan Helpers: format dengan 2 tempat desimal, lalu ganti. oleh ,
puts(("%.2f" % 2.5666).gsub('.',','))
>> 2,57
Anda dapat menggunakan metode dari ActiveSupport
Sebagai contoh:
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
Ini jalan saya di ruby
Edit penambahan: Pada dasarnya ia menambahkan semua koma di antara angka-angka dan hanya memilih yang koma dengan indeks + 1% 6
Saya pikir koma hingga 100 baik-baik saja, tetapi jika Anda ingin nomor super panjang, buatlah 100 lebih tinggi
sintaks baru
number_with_delimeter(@number, delimeter: ",")
Jika Anda ingin delimeter pengguna untuk uang maka Anda dapat melakukannya
number_to_currency(@number)
ini akan menambah $juga. Jika Anda menggunakan moneypermata maka Anda bisa melakukannya
Money.new(@number,"USD").format
Ini juga akan dimasukkan $.
Berikut ini lakukan trik untuk pembatas dan presisi ( API ref ).
ActiveSupport::NumberHelper.number_to_rounded(1234.532, delimiter: ',', precision: 1)
(atau dari tampilan saja number_to_rounded, tidak perlu sufiks)
HTH
ActionView::Helpers::NumberHelperdalam modul.