Есть ли способ, чтобы рельсы отображали число с запятыми в нем?
Например, если у меня есть номер 54000000.34, я могу запустить <% = number.function% > , который распечатает "54 000 000,34"
спасибо!
Есть ли способ, чтобы рельсы отображали число с запятыми в нем?
Например, если у меня есть номер 54000000.34, я могу запустить <% = number.function% > , который распечатает "54 000 000,34"
спасибо!
Вам нужен метод number_with_delimiter
. Например:
<%= number_with_delimiter(@number, :delimiter => ',') %>
В качестве альтернативы вы можете использовать метод number_with_precision
, чтобы гарантировать, что номер всегда отображается с точностью до двух знаков после запятой:
<%= number_with_precision(@number, :precision => 2, :delimiter => ',') %>
Для тех, кто не использует рельсы:
number.to_s.reverse.gsub(/(\d{3})(?=\d)/, '\\1,').reverse
Да, используйте NumberHelper. Метод, который вы ищете, number_with_delimiter.
number_with_delimiter(98765432.98, :delimiter => ",", :separator => ".")
# => 98,765,432.98
Если вы делаете это много, но также и FYI, потому что это не подразумевается выше, 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
Не нужно указывать значение разделителя, если вы делаете это наиболее типичным способом.
Если вы хотите добавить запятые вне представлений, и вы не хотите включать некоторые модули, вы можете использовать number_to_delimited метод ( rails version >= 4.02). Например:
#inside anywhere
ActiveSupport::NumberHelper.number_to_delimited(1000000) # => "1,000,000"
Лучший способ для тех, кто не использует рельсы, которые обрабатывают десятичные знаки:
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
Прямой способ сделать это, с или без Rails, это:
require 'active_support/core_ext/numeric/conversions'
12345.to_s(:delimited) # => "12,345"
12345.6789.to_s(:delimited) # => "12,345.6789"
Дополнительные параметры см. в разделе Активные расширения базовой поддержки - числовое - форматирование.
Другое решение, которое не использует Helpers: формат с 2 десятичными знаками, а затем замените. by,
puts(("%.2f" % 2.5666).gsub('.',','))
>> 2,57
для пользователей javascript
function numberWithDelimiter(value) {
return (value+"").split("").reverse().join("").replace(/(\d{3})(?=\d)/g, '$1,').split("").reverse().join("")
}
:)
Вы можете использовать методы из ActiveSupport
Например:
ActiveSupport::NumberHelper::number_to_currency(10000.1234,{precision: 2,unit: ''})