Ответы:
Вы хотите number_with_delimiter
метод. Например:
<%= number_with_delimiter(@number, :delimiter => ',') %>
Кроме того, вы можете использовать number_with_precision
метод, чтобы гарантировать, что число всегда отображается с двумя десятичными разрядами точности:
<%= number_with_precision(@number, :precision => 2, :delimiter => ',') %>
number_with_delimiter
слишком сложный и очень медленный, с огромной глубиной стеков вызовов. Он используется i18n
для того, чтобы иметь возможность форматировать любые числа, известные человечеству и внеземным цивилизациям (или, может быть, просто выбрать один ,
или .
для десятичных цифр, даже если вы укажете его в качестве аргумента). Он распределяет тысячи объектов (поэтому его шаблоны производительности сложны и трудно профилируемы). Попробуйте использовать регулярные выражения, если вам не нужно поддерживать разные способы форматирования чисел в зависимости от локали.
Для тех, кто не использует рельсы:
number.to_s.reverse.gsub(/(\d{3})(?=\d)/, '\\1,').reverse
number.to_s.reverse.scan(/(?:\d*\.)?\d{1,3}-?/).join(',').reverse
\1
достаточно? Спасибо.
Прямой способ сделать это с Rails или без него:
require 'active_support/core_ext/numeric/conversions'
12345.to_s(:delimited) # => "12,345"
12345.6789.to_s(:delimited) # => "12,345.6789"
Дополнительные параметры см. В разделе Расширения активной поддержки - Числовые - Форматирование .
ActiveSupport::NumberHelper.number_to_delimited
также. Этот ответ заслуживает гораздо больше голосов.
Да, используйте NumberHelper . Метод, который вы ищете, это number_with_delimiter .
number_with_delimiter(98765432.98, :delimiter => ",", :separator => ".")
# => 98,765,432.98
Если вы хотите добавить запятые вне представлений и не хотите включать некоторые модули, вы можете использовать метод number_to_delimited (rails version> = 4.02). Например:
#inside anywhere
ActiveSupport::NumberHelper.number_to_delimited(1000000) # => "1,000,000"
Если вы делаете это много, но также и к сведению, потому что это не подразумевается выше, у Rails есть разумные значения по умолчанию для number_with_delimiter
метода.
#inside controller or view
number_with_delimiter(2444323.4)
#=> 2,444,323.30
#inside console
helper.number_with_delimiter(233423)
#=> 233,423
Не нужно указывать значение разделителя, если вы делаете это наиболее типичным способом.
Лучший способ для тех, кто не использует рельсы, которые обрабатывают десятичные дроби:
parts = number.to_s.split('.')
parts[0].gsub!(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1,")
parts.join('.')
Если вы хотите использовать другой разделитель, измените последний символ ',' в регулярном выражении.
Для бонуса, это то, как работает регулярное выражение:
\\1
. \\1
становится \1
при оценке, которая соответствует первой группе захвата в регулярном выражении. В этом регулярном выражении это (\d)
.(\d)(?=(\d\d\d)+)
соответствует цифре, за которой следуют 1 или более групп из 3 цифр. Первый набор паренов - это наша \1
группа захвата, второй будет \2
. Если бы мы просто оставили это, мы получили бы:
123456.gsub!(/(\d)(?=(\d\d\d)+)/, "\\1,") #=> 1,2,3,456
Это потому, что 1234 совпадения, 2345 совпадений и 3456 совпадений, поэтому мы ставим запятую после 1, 2 и 3.(\d)(?=(\d\d\d)+(?!\d))
означает совпадение с цифрой, за которой следуют 3 цифры, за которыми не следует цифра. Причина, по которой это работает, заключается в том, что gsub будет продолжать заменять вещи, соответствующие строке. Если бы мы собирались заменить только первый матч, то для числа, такого как 123456789, мы получили бы 123456,789. Поскольку 123456,789 все еще соответствует нашему регулярному выражению, мы получаем 123,456,789.Вот где я получил код: https://github.com/rails/rails/blob/master/activesupport/lib/active_support/number_helper.rb#L298-L300
И вот где я узнал о том, что происходит в этом регулярном выражении: http://www.tutorialspoint.com/ruby/ruby_regular_expressions.htm
{{ value | round | replace: "(\d)(?=(\d\d\d)+(?!\d))", "$1," | prepend: "$" }}
Другое решение, которое не использует хелперы: отформатируйте с двумя десятичными знаками, а затем замените. по ,
puts(("%.2f" % 2.5666).gsub('.',','))
>> 2,57
Вы можете использовать методы из ActiveSupport
Например:
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
Это был мой путь в рубине
Редактирование дополнения: по существу, оно добавляет все запятые между числами и выбирает только те, где индекс + 1% 6
Я полагал, что запятые до 100 - это хорошо, но если вы хотите получить супер длинное число, просто сделайте 100 большим числом
новый синтаксис
number_with_delimeter(@number, delimeter: ",")
Если вы хотите, чтобы пользователь delimeter за деньги, то вы можете сделать
number_to_currency(@number)
это тоже добавит $
. Если вы используете money
драгоценный камень, то вы можете сделать
Money.new(@number,"USD").format
Это тоже будет ставить $
.
Следующее делает трюк как для разделителя, так и для точности ( API ref ).
ActiveSupport::NumberHelper.number_to_rounded(1234.532, delimiter: ',', precision: 1)
(или просто из представлений number_to_rounded
, суффикс не нужен)
НТН
ActionView::Helpers::NumberHelper
внутри модуля.