Respuestas:
Quieres el number_with_delimiter
método. Por ejemplo:
<%= number_with_delimiter(@number, :delimiter => ',') %>
Alternativamente, puede usar el number_with_precision
método para asegurarse de que el número siempre se muestre con dos decimales de precisión:
<%= number_with_precision(@number, :precision => 2, :delimiter => ',') %>
number_with_delimiter
es demasiado complejo y realmente lento, con enormes profundidades de pilas de llamadas. Suele i18n
ser capaz de formatear cualquier número conocido por la humanidad y las civilizaciones extraterrestres (o tal vez solo para elegir uno ,
o .
para dígitos decimales, incluso si lo especifica como argumento). Asigna miles de objetos (por lo que sus patrones de rendimiento son complejos y difíciles de perfilar). Considere simplemente usar expresiones regulares si no necesita admitir diferentes formas de formatear números dependiendo de la configuración regional.
Para cualquiera que no use rieles:
number.to_s.reverse.gsub(/(\d{3})(?=\d)/, '\\1,').reverse
number.to_s.reverse.scan(/(?:\d*\.)?\d{1,3}-?/).join(',').reverse
\1
suficiente? Gracias.
La forma directa de hacer esto, con o sin Rails , 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 Extensiones principales de soporte activo - Numérico - Formateo .
ActiveSupport::NumberHelper.number_to_delimited
. Esta respuesta merece muchos más votos a favor.
Sí, use el NumberHelper . El método que está buscando es number_with_delimiter .
number_with_delimiter(98765432.98, :delimiter => ",", :separator => ".")
# => 98,765,432.98
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"
Si lo está haciendo mucho pero también para su información porque no está implícito en lo anterior, Rails tiene valores predeterminados razonables para el number_with_delimiter
método.
#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 del delimitador si lo está haciendo de la manera más típica.
Una mejor manera para aquellos que no usan rieles 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.
Como bonificación, así es como funciona la expresión regular:
\\1
. \\1
se convierte \1
cuando se evalúa cuál coincide con el primer grupo de captura en la expresión regular. En esta expresión regular que es (\d)
.(\d)(?=(\d\d\d)+)
coincide con un dígito seguido de 1 o más grupos de 3 dígitos. El primer grupo de padres es nuestro \1
grupo de captura, el segundo sería \2
. Si lo dejáramos así, obtendríamos:
123456.gsub!(/(\d)(?=(\d\d\d)+)/, "\\1,") #=> 1,2,3,456
Esto se debe a 1234 coincidencias, 2345 coincidencias y 3456 coincidencias, por lo que colocamos una coma después del 1, el 2 y el 3.(\d)(?=(\d\d\d)+(?!\d))
significa que coincide con un dígito seguido de 3 dígitos que no son seguidos por un dígito. La razón por la que esto funciona es que gsub seguirá reemplazando cosas que coincidan con la cadena. Si solo íbamos a reemplazar el primer partido, entonces para un número como 123456789 obtendríamos 123456,789. Como 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í acerca de lo que está sucediendo en esa expresión regular: http://www.tutorialspoint.com/ruby/ruby_regular_expressions.htm
{{ value | round | replace: "(\d)(?=(\d\d\d)+(?!\d))", "$1," | prepend: "$" }}
Otra solución que no usa Helpers: formatee con 2 decimales y luego reemplace. por
puts(("%.2f" % 2.5666).gsub('.',','))
>> 2,57
Puedes usar métodos de ActiveSupport
Por ejemplo:
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
Este era mi camino en rubí
Edición adicional: Básicamente, agrega todas las comas entre los números y solo selecciona aquellas en las que el índice + 1% 6
Me imaginé que las comas hasta 100 estaban bien, pero si quieres un número súper largo simplemente haz 100 un número más alto
nueva sintaxis
number_with_delimeter(@number, delimeter: ",")
Si desea usar el delimitador por dinero, puede hacerlo
number_to_currency(@number)
esto agregará $
también. Si estás usando money
gema, entonces puedes hacer
Money.new(@number,"USD").format
Esto también lo pondrá $
.
Lo siguiente hace el truco para el delimitador y la precisión ( API ref ).
ActiveSupport::NumberHelper.number_to_rounded(1234.532, delimiter: ',', precision: 1)
(o solo desde las vistas number_to_rounded
, no es necesario el sufijo)
HTH
ActionView::Helpers::NumberHelper
dentro del módulo.