Odpowiedzi:
Chcesz number_with_delimiter
metodę. Na przykład:
<%= number_with_delimiter(@number, :delimiter => ',') %>
Alternatywnie możesz użyć tej number_with_precision
metody, aby upewnić się, że liczba jest zawsze wyświetlana z dokładnością do dwóch miejsc po przecinku:
<%= number_with_precision(@number, :precision => 2, :delimiter => ',') %>
number_with_delimiter
jest zbyt skomplikowany i bardzo powolny, z ogromną głębokością stosów połączeń. Służy i18n
do formatowania dowolnych liczb znanych ludzkości i cywilizacjom pozaziemskim (lub może po prostu wybrać cyfrę dziesiętną ,
lub .
dziesiętną, nawet jeśli podasz ją jako argument). Przydziela tysiące obiektów (więc wzorce wydajności są złożone i trudne do profilowania). Rozważ użycie wyrażeń regularnych, jeśli nie potrzebujesz obsługiwać różnych sposobów formatowania liczb w zależności od ustawień regionalnych.
Dla każdego, kto nie używa szyn:
number.to_s.reverse.gsub(/(\d{3})(?=\d)/, '\\1,').reverse
number.to_s.reverse.scan(/(?:\d*\.)?\d{1,3}-?/).join(',').reverse
\1
wystarcza? Dzięki.
Bezpośrednim sposobem na to, z Railsami lub bez , jest:
require 'active_support/core_ext/numeric/conversions'
12345.to_s(:delimited) # => "12,345"
12345.6789.to_s(:delimited) # => "12,345.6789"
Aby uzyskać więcej opcji, zobacz Aktywne rozszerzenia podstawowe wsparcia - Numeryczne - Formatowanie .
ActiveSupport::NumberHelper.number_to_delimited
. Ta odpowiedź zasługuje na dużo więcej pozytywnych opinii.
Tak, użyj NumberHelper . Metoda, której szukasz, to number_with_delimiter .
number_with_delimiter(98765432.98, :delimiter => ",", :separator => ".")
# => 98,765,432.98
Jeśli chcesz dodać przecinki poza widokami i nie chcesz dołączać niektórych modułów, możesz użyć metody number_to_delimited (wersja szyn>> 4.02). Na przykład:
#inside anywhere
ActiveSupport::NumberHelper.number_to_delimited(1000000) # => "1,000,000"
Jeśli robisz to dużo, ale także FYI, ponieważ nie wynika to z powyższego, Rails ma rozsądne wartości domyślne dla tej number_with_delimiter
metody.
#inside controller or view
number_with_delimiter(2444323.4)
#=> 2,444,323.30
#inside console
helper.number_with_delimiter(233423)
#=> 233,423
Nie musisz podawać wartości separatora, jeśli robisz to w najbardziej typowy sposób.
Lepszy sposób dla tych, którzy nie używają szyn, które obsługują dziesiętne:
parts = number.to_s.split('.')
parts[0].gsub!(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1,")
parts.join('.')
Jeśli chcesz innego separatora, zmień ostatnie „,” w wyrażeniu regularnym.
W przypadku premii działa to wyrażenie regularne:
\\1
. \\1
staje się \1
po ocenie, która pasuje do pierwszej grupy przechwytywania w wyrażeniu regularnym. To jest w tym wyrażeniu regularnym (\d)
.(\d)(?=(\d\d\d)+)
dopasowuje cyfrę, po której następuje 1 lub więcej grup 3 cyfr. Pierwszy zestaw parenów to nasza \1
grupa przechwytywania, drugi byłby \2
. Gdybyśmy to po prostu zostawili, otrzymalibyśmy:
123456.gsub!(/(\d)(?=(\d\d\d)+)/, "\\1,") #=> 1,2,3,456
To dlatego, że 1234 mecze, 2345 meczów i 3456 meczów, więc wstawiamy przecinek po 1, 2 i 3.(\d)(?=(\d\d\d)+(?!\d))
oznacza dopasowanie cyfry, po której następują 3 cyfry, po których nie następuje cyfra. Powodem, dla którego to działa, jest to, że gsub będzie zastępował rzeczy pasujące do łańcucha. Gdybyśmy tylko zamienili pierwszy mecz, to dla liczby takiej jak 123456789 otrzymalibyśmy 123456,789. Ponieważ 123456 789 nadal pasuje do naszego wyrażenia regularnego, otrzymujemy 123 456 789.Oto skąd mam kod: https://github.com/rails/rails/blob/master/activesupport/lib/active_support/number_helper.rb#L298-L300
I tutaj dowiedziałem się o tym, co się dzieje w tym wyrażeniu regularnym: http://www.tutorialspoint.com/ruby/ruby_regular_expressions.htm
{{ value | round | replace: "(\d)(?=(\d\d\d)+(?!\d))", "$1," | prepend: "$" }}
Inne rozwiązanie, które nie korzysta z Pomocników: formatuj z 2 miejscami po przecinku, a następnie zamień. przez ,
puts(("%.2f" % 2.5666).gsub('.',','))
>> 2,57
Możesz użyć metod z ActiveSupport
Na przykład:
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
To była moja droga w rubinie
Edycja dodawania: Zasadniczo dodaje wszystkie przecinki między liczbami i wybiera tylko te, w których indeks + 1% 6
Doszedłem do wniosku, że przecinki do 100 są w porządku, ale jeśli chcesz super długiej liczby, po prostu zwiększ 100
nowa składnia
number_with_delimeter(@number, delimeter: ",")
Jeśli chcesz użyć delimtera dla pieniędzy, możesz to zrobić
number_to_currency(@number)
to $
też doda . Jeśli używasz money
klejnotu, możesz to zrobić
Money.new(@number,"USD").format
To też umieści $
.
Wykonaj sztuczkę zarówno dla separatora, jak i precyzji ( odwołanie API ).
ActiveSupport::NumberHelper.number_to_rounded(1234.532, delimiter: ',', precision: 1)
(lub tylko z widoków number_to_rounded
, nie ma potrzeby przyrostka)
HTH
ActionView::Helpers::NumberHelper
do modułu.