İçinde virgül bulunan bir sayıyı yazdırmanın bir yolu var mı?
Örneğin, 54000000.34'lük bir numaram varsa, "% 54.000.000.34" yazdıracak <% = number.function%> çalıştırabilirim.
Teşekkürler!
İçinde virgül bulunan bir sayıyı yazdırmanın bir yolu var mı?
Örneğin, 54000000.34'lük bir numaram varsa, "% 54.000.000.34" yazdıracak <% = number.function%> çalıştırabilirim.
Teşekkürler!
Yanıtlar:
number_with_delimiter
Yöntemi istiyorsunuz . Örneğin:
<%= number_with_delimiter(@number, :delimiter => ',') %>
Alternatif olarak, number_with_precision
sayının her zaman iki ondalık hassasiyetle görüntülenmesini sağlamak için yöntemi kullanabilirsiniz :
<%= number_with_precision(@number, :precision => 2, :delimiter => ',') %>
number_with_delimiter
Aşırı karmaşık ve gerçekten yavaş, muazzam çağrı yığınları derinliği ile. i18n
İnsanlık ve dünya dışı medeniyetler tarafından bilinen herhangi bir sayıyı biçimlendirmek için kullanır (veya bağımsız değişken olarak belirtseniz bile, yalnızca ondalık basamaklar için ,
veya birini seçmek .
için). Binlerce nesne tahsis eder (bu nedenle performans kalıpları karmaşıktır ve profili zor). Yerel ayara bağlı olarak sayıları biçimlendirmenin farklı yollarını desteklemeniz gerekmiyorsa, yalnızca normal ifadeleri kullanmayı düşünün.
Ray kullanmayanlar için:
number.to_s.reverse.gsub(/(\d{3})(?=\d)/, '\\1,').reverse
number.to_s.reverse.scan(/(?:\d*\.)?\d{1,3}-?/).join(',').reverse
\1
yeterli değil mi? Teşekkürler.
Rails ile veya Rails olmadan bunu yapmanın doğrudan yolu :
require 'active_support/core_ext/numeric/conversions'
12345.to_s(:delimited) # => "12,345"
12345.6789.to_s(:delimited) # => "12,345.6789"
Daha fazla seçenek için bkz. Etkin Destek Çekirdek Uzantıları - Sayısal - Biçimlendirme .
ActiveSupport::NumberHelper.number_to_delimited
. Bu cevap çok daha fazla oyu hak ediyor.
Evet, NumberHelper'ı kullanın . Aradığınız yöntem number_with_delimiter .
number_with_delimiter(98765432.98, :delimiter => ",", :separator => ".")
# => 98,765,432.98
Görünümlerin dışında virgül eklemek istiyorsanız ve bazı modüller eklemek istemiyorsanız, number_to_delimited yöntemini kullanabilirsiniz (rails sürümü> = 4.02). Örneğin:
#inside anywhere
ActiveSupport::NumberHelper.number_to_delimited(1000000) # => "1,000,000"
Çok fazla değil, aynı zamanda FYI'yi de yukarıdakiler tarafından ima edilmediğinden, Rails'in number_with_delimiter
yöntem için varsayılan varsayılanları vardır .
#inside controller or view
number_with_delimiter(2444323.4)
#=> 2,444,323.30
#inside console
helper.number_with_delimiter(233423)
#=> 233,423
En tipik şekilde yapıyorsanız sınırlayıcı değerini sağlamanıza gerek yoktur.
Ondalık basamakları işleyen raylar kullanmayanlar için daha iyi bir yol:
parts = number.to_s.split('.')
parts[0].gsub!(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1,")
parts.join('.')
Farklı bir sınırlayıcı istiyorsanız, normal ifadedeki son ',' işaretini değiştirin.
Bonus için, normal ifade şu şekilde çalışır:
\\1
.\\1
\1
normal ifadedeki ilk yakalama grubuyla eşleşen değerlendirildiğinde olur . Bu normal ifadede(\d)
.(\d)(?=(\d\d\d)+)
bir rakam ve ardından 1 veya daha fazla 3 basamaklı grup eşleşiyor. İlk parens seti bizim\1
yakalama grubumuz, ikincisi olurdu \2
. Eğer sadece onu bırakacak olsaydık,
123456.gsub!(/(\d)(?=(\d\d\d)+)/, "\\1,") #=> 1,2,3,456
bunun nedeni 1234 maç, 2345 maç ve 3456 maç olduğu için 1, 2 ve 3'ten sonra virgül koyduk.(\d)(?=(\d\d\d)+(?!\d))
bir rakamın ardından bir rakamın ardından gelen 3 rakamın eşleşmesi anlamına gelir. Bunun çalışmasının nedeni, gsub'ın dizeyle eşleşen şeylerin yerini almaya devam etmesidir. Sadece ilk maçı değiştirecek olsaydık, 123456789 gibi bir sayı için 123456,789 alırdık. 123456.789 hala normal ifademizle eşleştiğinden 123.456.789 elde ediyoruz.İşte kodu aldım: https://github.com/rails/rails/blob/master/activesupport/lib/active_support/number_helper.rb#L298-L300
Ve işte bu regex'te neler olduğunu öğrendim: http://www.tutorialspoint.com/ruby/ruby_regular_expressions.htm
{{ value | round | replace: "(\d)(?=(\d\d\d)+(?!\d))", "$1," | prepend: "$" }}
Helpers kullanmayan başka bir çözüm: 2 ondalık basamakla biçimlendirin ve değiştirin. tarafından ,
puts(("%.2f" % 2.5666).gsub('.',','))
>> 2,57
Şu yöntemleri kullanabilirsiniz: ActiveSupport
Örneğin:
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
Bu yakutta benim yolumdu
Ekleme düzenleme: Temelde sayılar arasındaki tüm virgülleri ekler ve sadece endeksin +% 1% 6
100'e kadar virgülün iyi olduğunu düşündüm ama süper uzun bir sayı istiyorsanız sadece 100 daha yüksek bir sayı yapın
yeni sözdizimi
number_with_delimeter(@number, delimeter: ",")
Para için kullanıcı sınırlayıcıyı istiyorsanız, bunu yapabilirsiniz
number_to_currency(@number)
bu da eklenecektir $
. money
Gem kullanıyorsanız o zaman yapabilirsiniz
Money.new(@number,"USD").format
Bu da koyacaktır $
.
Aşağıdakiler hem sınırlayıcı hem de kesinlik ( API ref ) için hile yapar .
ActiveSupport::NumberHelper.number_to_rounded(1234.532, delimiter: ',', precision: 1)
(veya yalnızca görüşlere göre number_to_rounded
, son eke gerek yoktur)
HTH
ActionView::Helpers::NumberHelper
içine dahil ederek bir modülden kullanabilmeniz gerekir .