Jawaban:
Anda menginginkan number_with_delimiter
metodenya. Sebagai contoh:
<%= number_with_delimiter(@number, :delimiter => ',') %>
Atau, Anda dapat menggunakan number_with_precision
metode ini untuk memastikan bahwa angka selalu ditampilkan dengan dua tempat desimal presisi:
<%= number_with_precision(@number, :precision => 2, :delimiter => ',') %>
number_with_delimiter
terlalu rumit dan sangat lambat, dengan kedalaman tumpukan panggilan yang sangat besar. Ini digunakan i18n
untuk 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
\1
cukup? 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_delimited
juga. 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_delimiter
metode 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
. \\1
menjadi \1
ketika 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 \1
grup 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,456
Ini 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 money
permata 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::NumberHelper
dalam modul.