¿Hay un truco de rails para agregar comas a números grandes?


¿Hay alguna forma de que rails imprima un número con comas?

Por ejemplo, si tengo un número 54000000.34, puedo ejecutar , que imprimiría "54,000,000. 34"

Gracias!

Author: John Topley, 2009-07-03

11 answers

Usted quiere el number_with_delimiter método. Por ejemplo:

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

Alternativamente, puede utilizar el number_with_precision método para asegurar que el número siempre se muestra con dos decimales de precisión:

<%= number_with_precision(@number, :precision => 2, :delimiter => ',') %>
 318
Author: John Topley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-03 08:54:54

Para cualquiera que no use rails:

number.to_s.reverse.gsub(/(\d{3})(?=\d)/, '\\1,').reverse
 114
Author: pguardiario,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-13 08:25:09

Sí, use el Ayuda numérica. El método que está buscando es number_with_delimiter .

 number_with_delimiter(98765432.98, :delimiter => ",", :separator => ".")
 # => 98,765,432.98
 27
Author: PatrikAkerstrand,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-03 11:55:14

Si lo estás haciendo mucho, pero también para tu información porque no está implícito en lo anterior, Rails tiene valores predeterminados razonables para el método 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

No es necesario proporcionar el valor delimitador si lo está haciendo de la manera más típica.

 18
Author: coloradoblue,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-22 07:13:03

Si desea agregar comas fuera de las vistas y no desea incluir algunos módulos, puede usar el método number_to_delimited (versión de rails >= 4.02). Por ejemplo:

#inside anywhere
ActiveSupport::NumberHelper.number_to_delimited(1000000) # => "1,000,000"
 16
Author: Александр Рыхлицкий,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-21 09:53:18

Una mejor manera para aquellos que no usan rails que maneja decimales:

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

Si desea un delimitador diferente, cambie el último ',' en la expresión regular.

Para bonus, así es como funciona la expresión regular:

  • gsub reemplaza todo lo que coincide con la expresión regular con el segundo parámetro pasado a gsub. En este caso es \\1. \\1 se convierte en \1 cuando se evalúa que coincide con el primer grupo de captura en la expresión regular. En esta expresión regular que es (\d).
  • (\d)(?=(\d\d\d)+) es coincidencia de un dígito seguido de 1 o más grupos de 3 dígitos. El primer conjunto de paréntesis es nuestro \1 grupo de captura, el segundo sería \2. Si simplemente lo dejáramos así, obtendríamos: 123456.gsub!(/(\d)(?=(\d\d\d)+)/, "\\1,") #=> 1,2,3,456 Esto se debe a que 1234 coincidencias, 2345 coincidencias y 3456 coincidencias, por lo que ponemos una coma después del 1, el 2 y el 3.
  • Añadiendo el (?!\d) estamos haciendo coincidir cualquier cosa que viene antes que no precede a un dígito, por lo que (\d)(?=(\d\d\d)+(?!\d)) significa hacer coincidir un dígito seguido de 3 dígitos que no es seguido por un dígito. El la razón por la que esto funciona es que gsub seguirá reemplazando cosas que coincidan con la cadena. Si solo fuéramos a reemplazar el primer partido, entonces para un número como 123456789 obtendríamos 123456,789. Desde 123456,789 todavía coincide con nuestra expresión regular obtenemos 123,456,789.

Aquí es donde obtuve el código: https://github.com/rails/rails/blob/master/activesupport/lib/active_support/number_helper.rb#L298-L300

Y aquí es donde aprendí sobre lo que está pasando en esa expresión regular: http://www.tutorialspoint.com/ruby/ruby_regular_expressions.htm

 10
Author: fxfilmxf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-19 00:43:50

La forma directa de hacer esto, con o sin Rieles , es:

require 'active_support/core_ext/numeric/conversions'

12345.to_s(:delimited)      # => "12,345"
12345.6789.to_s(:delimited) # => "12,345.6789"

Para obtener más opciones, consulte Active Support Core Extensions - Numeric - Formatting.

 7
Author: chocolateboy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-02 19:18:19

Otra solución que no usa ayudantes: formatee con 2 decimales y luego reemplace . by,

puts(("%.2f" % 2.5666).gsub('.',','))
>> 2,57
 2
Author: Nino van Hooff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-31 10:33:12

Para la gente de javascript

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

:)

 1
Author: aqm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-19 16:00:23

Puedes usar métodos desde ActiveSupport

Por ejemplo:

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

 1
Author: Le Duc Duy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-22 17:03:33
  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

Este era mi camino en ruby

Adición editar: Básicamente agrega todas las comas entre los números y solo selecciona aquellos donde el índice + 1% 6

Me imaginé que las comas hasta 100 estaba bien, pero si quieres un número súper largo, haz 100 un número más alto

 1
Author: Justin Cox,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-14 20:29:24