Есть ли трюк с рельсами для добавления запятых к большим числам?

Есть ли способ, чтобы рельсы отображали число с запятыми в нем?

Например, если у меня есть номер 54000000.34, я могу запустить <% = number.function% > , который распечатает "54 000 000,34"

спасибо!

Ответ 1

Вам нужен метод number_with_delimiter. Например:

<%= number_with_delimiter(@number, :delimiter => ',') %>

В качестве альтернативы вы можете использовать метод number_with_precision, чтобы гарантировать, что номер всегда отображается с точностью до двух знаков после запятой:

<%= number_with_precision(@number, :precision => 2, :delimiter => ',') %>

Ответ 2

Для тех, кто не использует рельсы:

number.to_s.reverse.gsub(/(\d{3})(?=\d)/, '\\1,').reverse

Ответ 3

Да, используйте NumberHelper. Метод, который вы ищете, number_with_delimiter.

 number_with_delimiter(98765432.98, :delimiter => ",", :separator => ".")
 # => 98,765,432.98

Ответ 4

Если вы делаете это много, но также и 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

Не нужно указывать значение разделителя, если вы делаете это наиболее типичным способом.

Ответ 5

Если вы хотите добавить запятые вне представлений, и вы не хотите включать некоторые модули, вы можете использовать number_to_delimited метод ( rails version >= 4.02). Например:

#inside anywhere
ActiveSupport::NumberHelper.number_to_delimited(1000000) # => "1,000,000"

Ответ 6

Лучший способ для тех, кто не использует рельсы, которые обрабатывают десятичные знаки:

parts = number.to_s.split('.')
parts[0].gsub!(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1,")
parts.join('.')

Если вам нужен другой разделитель, измените последнее ',' в регулярном выражении.

Для бонуса, как работает регулярное выражение:

  • gsub заменяет все, что соответствует регулярному выражению, со вторым параметром, переданным в gsub. В этом случае это \\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)+(?!\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

Ответ 8

Другое решение, которое не использует Helpers: формат с 2 десятичными знаками, а затем замените. by,

puts(("%.2f" % 2.5666).gsub('.',','))
>> 2,57

Ответ 9

для пользователей javascript

function numberWithDelimiter(value) {
    return (value+"").split("").reverse().join("").replace(/(\d{3})(?=\d)/g, '$1,').split("").reverse().join("")
}

:)

Ответ 10

Вы можете использовать методы из ActiveSupport

Например:

ActiveSupport::NumberHelper::number_to_currency(10000.1234,{precision: 2,unit: ''})