大きな数にコンマを追加するためのRailsトリックはありますか?


201

レールにカンマが含まれている数値を出力させる方法はありますか?

たとえば、54000000.34という番号がある場合、<%= number.function%>を実行すると、「54,000,000.34」が出力されます。

ありがとう!

回答:


353

あなたはnumber_with_delimiter方法が欲しいです。例えば:

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

または、number_with_precisionメソッドを使用して、数値が常に小数点以下2桁の精度で表示されるようにすることができます。

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

5
@Moこれはビューヘルパーメソッドです。モジュールActionView::Helpers::NumberHelper内に含めることで、モジュールから使用できるはずです。
John Topley、2010

9
デフォルトでは区切り文字はコンマであるため、この場合はそのオプションを渡す必要はありません。
Deekor 2013年

3
現在のロケールが何を使用するかを決定できるように、区切り文字はオフのままにしておく必要があります。これにより、区切り文字にピリオドを使用するロケールが、小数点と見なされるものを数千の間で置くのではなく、正しく表示されるようになります。以下のcoloradoblueの回答を参照してください。
Kyle Heironimus 2013

1
Rails 4の構文:<%= number_with_precision(@number、precision:0、delimiter: '、')%>
Choylton B. Higginbottom

2
注意:number_with_delimiter非常に複雑で、非常に遅く、非常に深い呼び出しスタックがあります。i18n人類や地球外の文明に知られている任意の数値をフォーマットできるようにするために使用します(または、引数として指定した場合でも、おそらく,またはいずれかまたは.10進数字を選択するためにのみ)。数千のオブジェクトを割り当てます(そのため、そのパフォーマンスパターンは複雑であり、プロファイリングが困難です)。ロケールに応じて数値をフォーマットするさまざまな方法をサポートする必要がない場合は、正規表現の使用のみを検討してください。
kolen 2018

133

レールを使用しない人のために:

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

2
いいね。そして、あなたの答えがあるように思わ細かく速いアプローチが提示よりも、(百万回の反復を超えるのはほんの一瞬)ここにnumber.to_s.reverse.scan(/(?:\d*\.)?\d{1,3}-?/).join(',').reverse
user664833

ここで何が起こっているのか説明できますか?number.to_s.reverse.gsub(/(\ d {3})(?= \ d)/、 '\\ 1、')。reverse
Stephen Nguyen

7
確かに、それは文字列を逆にし、次に別の数字が続く3桁のシーケンスの後にコンマを追加し、それを元に戻します。
pguardiario 2013

1
@renosis-今の意味はわかります。これは通貨のフォーマット用です。つまり、7ではなく2桁の小数
pguardiario

2
@pguardiario \\ 1の余分な\は何ですか?\1十分ではありませんか?ありがとう。
butterywombat 2014年

31

Railsの有無にかかわらず、これを行う直接的な方法は次のとおりです。

require 'active_support/core_ext/numeric/conversions'

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

その他のオプションについては、「Active Support Core Extensions-Numeric-Formatting」を参照してください。


1
そして、このインクルージョンを使用するとActiveSupport::NumberHelper.number_to_delimited、同様に使用できます。この回答は、さらに多くの賛成票を投じる価値があります。
ユリスBN



19

上記で暗示されていないため、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

最も一般的な方法でデリミタ値を指定する必要はありません。


これには、現在のロケールを使用するという追加の利点があります。一部のロケールでは小数点にカンマを使用し、桁区切りにはピリオドを使用しているロケールがあるため、これは国際的なアプリでは非常に重要です。
Kyle Heironimus 2013

16

小数を処理するレールを使用しない場合のより良い方法:

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

別の区切り文字が必要な場合は、正規表現の最後の「、」を変更してください。

おまけとして、これは正規表現が機能する方法です:

  • gsubは、正規表現に一致するすべてのものを、gsubに渡された2番目のパラメーターで置き換えます。この場合はそれです\\1\\1なっ\1評価すると正規表現の最初のキャプチャグループに一致しています。この正規表現では、です(\d)
  • (\d)(?=(\d\d\d)+)は、数字とそれに続く3桁の1つ以上のグループに一致します。括弧の最初のセットは\1キャプチャグループで、2番目はです\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


特にリキッドテンプレートlangで、魅力のように動作します:{{ value | round | replace: "(\d)(?=(\d\d\d)+(?!\d))", "$1," | prepend: "$" }}
Kukunin

2

ヘルパーを使用しない別のソリューション:小数点以下2桁でフォーマットし、を置き換えます。沿って 、

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

1
私の質問は、あなたの答えが達成する大部分/小数部の小数点記号としてのコンマではなく、数字のグループ化のためのコンマに関するものだったと思います。(そのwikiリンクで説明されているように、長年の混乱のため、インターネットの標準では現在、数字のグループ化にのみスペースを推奨しています)
Beni Cherniavsky-Paskin

1

次のメソッドを使用できます ActiveSupport

例えば:

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


1
  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

これがルビーの私のやり方でした

加算編集:基本的に、数値の間にすべてのコンマを追加し、インデックス+ 1%6の数値のみを選択します

私は100までのカンマで結構だと思ったが、もし超長い数が欲しいのなら100をもっと大きな数にしてください


0

新しい構文

number_with_delimeter(@number, delimeter: ",")

あなたがお金のためにデリミターを使いたいなら、あなたはそうすることができます

number_to_currency(@number)

これも追加され$ます。あなたがmoneygem を使っているなら、あなたはそうすることができます

Money.new(@number,"USD").format

これも入れ$ます。

number_with_delimiter

ルビーマネー

number_to_currency


0

以下は、区切り文字と精度の両方のトリックを行いますAPI ref)。

ActiveSupport::NumberHelper.number_to_rounded(1234.532, delimiter: ',', precision: 1) 

(またはビューからのみnumber_to_rounded、サフィックスは必要ありません)

HTH


-1

JavaScriptユーザー向け

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

:)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.