Existe uma maneira de os trilhos imprimirem um número com vírgulas?
Por exemplo, se eu tiver um número 54000000.34, posso executar <% = number.function%>, que imprimiria "54.000.000.34"
obrigado!
ruby-on-rails
ruby
Jess
fonte
fonte
ActionView::Helpers::NumberHelper
dentro do módulo.number_with_delimiter
é muito complexo e muito lento, com enormes profundidades de pilhas de chamadas. Ele costumai18n
ser capaz de formatar qualquer número conhecido pela humanidade e por civilizações extraterrestres (ou talvez apenas escolher um,
ou.
para dígitos decimais, mesmo se você o especificar como argumento). Ele aloca milhares de objetos (portanto, seus padrões de desempenho são complexos e difíceis de criar perfil). Considere usar apenas regexps se não precisar oferecer suporte a diferentes maneiras de formatar números, dependendo da localidade.Para quem não usa trilhos:
fonte
number.to_s.reverse.scan(/(?:\d*\.)?\d{1,3}-?/).join(',').reverse
\1
suficiente? Obrigado.A maneira direta de fazer isso, com ou sem Rails , é:
Para obter mais opções, consulte Extensões principais do suporte ativo - numérico - formatação .
fonte
ActiveSupport::NumberHelper.number_to_delimited
. Esta resposta merece muito mais votos.Sim, use o NumberHelper . O método que você está procurando é number_with_delimiter .
fonte
Se você quiser adicionar vírgulas fora das visualizações e não incluir alguns módulos, poderá usar o método number_to_delimited (versão do rails> = 4.02). Por exemplo:
fonte
Se você está fazendo muito, mas também para o FYI, porque não está implícito no acima, o Rails possui padrões sensatos para o
number_with_delimiter
método.Não é necessário fornecer o valor do delimitador se você estiver fazendo da maneira mais típica.
fonte
Uma maneira melhor para quem não usa trilhos que lida com decimais:
Se você quiser um delimitador diferente, altere o último ',' na regex.
Para bônus, é assim que a regex está funcionando:
\\1
.\\1
torna-se\1
quando avaliado, que corresponde ao primeiro grupo de captura na regex. Nesse regex que é(\d)
.(\d)(?=(\d\d\d)+)
está correspondendo a um dígito seguido por 1 ou mais grupos de 3 dígitos. O primeiro conjunto de parênteses é o nosso\1
grupo de captura, o segundo seria\2
. Se fôssemos deixar assim, teríamos:123456.gsub!(/(\d)(?=(\d\d\d)+)/, "\\1,") #=> 1,2,3,456
isso ocorre porque 1234 correspondências, 2345 correspondências e 3456 correspondências, então colocamos uma vírgula após 1, 2 e 3.(\d)(?=(\d\d\d)+(?!\d))
significa igualar um dígito seguido por três dígitos que não são seguidos por um dígito. A razão pela qual isso funciona é que o gsub continuará substituindo coisas que correspondem à string. Se substituíssemos a primeira partida, para um número como 123456789, teríamos 123456.789. Como 123456.789 ainda corresponde ao nosso regex, obtemos 123.456.789.Aqui é onde eu obtive o código: https://github.com/rails/rails/blob/master/activesupport/lib/active_support/number_helper.rb#L298-L300
E aqui é onde eu aprendi sobre o que está acontecendo nesse regex: http://www.tutorialspoint.com/ruby/ruby_regular_expressions.htm
fonte
{{ value | round | replace: "(\d)(?=(\d\d\d)+(?!\d))", "$1," | prepend: "$" }}
Outra solução que não usa Helpers: formate com 2 casas decimais e substitua. de ,
fonte
Você pode usar métodos de
ActiveSupport
Por exemplo:
ActiveSupport::NumberHelper::number_to_currency(10000.1234,{precision: 2,unit: ''})
fonte
Este foi o meu caminho em rubi
Edição adicional: basicamente adiciona todas as vírgulas entre os números e seleciona apenas aquelas em que o índice + 1% 6
Achei que as vírgulas até 100 eram boas, mas se você quiser um número super longo, basta fazer 100 um número maior
fonte
nova sintaxe
Se você deseja delimeter por dinheiro, pode fazer
isso irá adicionar
$
também. Se você estiver usandomoney
gem, então você pode fazerIsso também colocará
$
.number_with_delimiter
dinheiro rubi
number_to_currency
fonte
A seguir, faça o truque para delimitador e precisão ( ref da API ).
(ou apenas de visualizações
number_to_rounded
, não é necessário o sufixo)HTH
fonte
para pessoas javascript
:)
fonte