Risposte:
Vuoi il number_with_delimiter
metodo. Per esempio:
<%= number_with_delimiter(@number, :delimiter => ',') %>
In alternativa, è possibile utilizzare il number_with_precision
metodo per assicurarsi che il numero sia sempre visualizzato con due decimali di precisione:
<%= number_with_precision(@number, :precision => 2, :delimiter => ',') %>
number_with_delimiter
è eccessivamente complesso e molto lento, con enormi profondità di stack di chiamate. Usa i18n
per essere in grado di formattare qualsiasi numero noto all'umanità e alle civiltà extraterrestri (o forse solo per scegliere una ,
o .
per le cifre decimali, anche se lo specifichi come argomento). Alloca migliaia di oggetti (quindi i suoi modelli di prestazioni sono complessi e difficili da profilare). Prendi in considerazione l'utilizzo di regexps se non hai bisogno di supportare diversi modi per formattare i numeri a seconda delle impostazioni locali.
Per chiunque non usi le rotaie:
number.to_s.reverse.gsub(/(\d{3})(?=\d)/, '\\1,').reverse
number.to_s.reverse.scan(/(?:\d*\.)?\d{1,3}-?/).join(',').reverse
\1
sufficiente? Grazie.
Il modo diretto per farlo, con o senza Rails , è:
require 'active_support/core_ext/numeric/conversions'
12345.to_s(:delimited) # => "12,345"
12345.6789.to_s(:delimited) # => "12,345.6789"
Per altre opzioni, vedi Estensioni del nucleo di supporto attivo - Numerico - Formattazione .
ActiveSupport::NumberHelper.number_to_delimited
. Questa risposta merita molti più voti.
Sì, utilizzare NumberHelper . Il metodo che stai cercando è number_with_delimiter .
number_with_delimiter(98765432.98, :delimiter => ",", :separator => ".")
# => 98,765,432.98
Se si desidera aggiungere virgole al di fuori delle viste e non si desidera includere alcuni moduli, è possibile utilizzare il metodo number_to_delimited (versione rotaie> = 4.02). Per esempio:
#inside anywhere
ActiveSupport::NumberHelper.number_to_delimited(1000000) # => "1,000,000"
Se lo stai facendo molto ma anche FYI perché non è implicito da quanto sopra, Rails ha impostazioni predefinite ragionevoli per il number_with_delimiter
metodo.
#inside controller or view
number_with_delimiter(2444323.4)
#=> 2,444,323.30
#inside console
helper.number_with_delimiter(233423)
#=> 233,423
Non è necessario fornire il valore del delimitatore se lo stai facendo nel modo più tipico.
Un modo migliore per coloro che non usano le guide che gestiscono i decimali:
parts = number.to_s.split('.')
parts[0].gsub!(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1,")
parts.join('.')
Se vuoi un delimitatore diverso, modifica l'ultimo ',' nella regex.
Per bonus, ecco come funziona il regex:
\\1
. \\1
diventa \1
quando valutato che corrisponde al primo gruppo di acquisizione nella regex. In questa regex che è(\d)
.(\d)(?=(\d\d\d)+)
corrisponde a una cifra seguita da 1 o più gruppi di 3 cifre. Il primo set di parentesi è il nostro \1
gruppo di acquisizione, il secondo sarebbe \2
. Se solo lo lasciassimo, otterremmo:
123456.gsub!(/(\d)(?=(\d\d\d)+)/, "\\1,") #=> 1,2,3,456
Questo perché 1234 partite, 2345 partite e 3456 partite quindi inseriamo una virgola dopo 1, 2 e 3.(\d)(?=(\d\d\d)+(?!\d))
mezzo corrispondano una cifra seguita da 3 cifre che non è seguita da una cifra. Il motivo per cui funziona è che gsub continuerà a sostituire le cose che corrispondono alla stringa. Se avessimo solo sostituito la prima partita, per un numero come 123456789 avremmo 123456.789. Dato che 123456.789 corrispondono ancora al nostro regex, otteniamo 123.456.789.Ecco dove ho ottenuto il codice: https://github.com/rails/rails/blob/master/activesupport/lib/active_support/number_helper.rb#L298-L300
Ed ecco dove ho imparato cosa sta succedendo in quella regex: http://www.tutorialspoint.com/ruby/ruby_regular_expressions.htm
{{ value | round | replace: "(\d)(?=(\d\d\d)+(?!\d))", "$1," | prepend: "$" }}
Un'altra soluzione che non utilizza gli helper: formatta con 2 cifre decimali e quindi sostituisci. di,
puts(("%.2f" % 2.5666).gsub('.',','))
>> 2,57
Puoi usare metodi da ActiveSupport
Per esempio:
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
Questa era la mia strada nel rubino
Modifica aggiunta: Fondamentalmente aggiunge tutte le virgole tra i numeri e seleziona solo quelle in cui l'indice + 1% 6
Ho pensato che le virgole fino a 100 andassero bene, ma se vuoi un numero molto lungo, fai 100 un numero più alto
nuova sintassi
number_with_delimeter(@number, delimeter: ",")
Se si desidera utilizzare il delimitatore per denaro, è possibile farlo
number_to_currency(@number)
questo aggiungerà $
anche. Se stai usando money
gem, allora puoi farlo
Money.new(@number,"USD").format
Questo metterà anche $
.
Di seguito sono riportati i suggerimenti sia per il delimitatore che per la precisione (riferimento API ).
ActiveSupport::NumberHelper.number_to_rounded(1234.532, delimiter: ',', precision: 1)
(o solo dalle visualizzazioni number_to_rounded
, non è necessario il suffisso)
HTH
ActionView::Helpers::NumberHelper
all'interno del modulo.