0

私は Web サイトのレポートに取り組んでおり、現在 BigDecimal -0.0 を処理する最善の方法を考えています。

私が扱っているデータベースには、それらがたくさんあります。これらの -0.0 を通すnumber_to_currency()と、「$-0.00」となります。負の数値の私の形式は実際には「-$x.xx」なので、number_to_currency が負の数値として書式設定されていないことに注意してください (そうしないと、ドル記号の前に負の記号が表示されます)、何らかの理由で負の符号は 0 とともに変換されています。

現在、私の解決策は、データベースから金額を取得するたびにこれを行うことです。

amount *= -1 if amount == 0 && amount.sign == -1

これにより、-0.0 が 0.0 に変更されます。それは十分に単純ですが、私が見つけていないこの状況を処理するためのより良い解決策、または BigDecimals または number_to_currency に何かがあるかどうか疑問に思わずにはいられません。

4

1 に答える 1

2

これは、数値が文字列に変換されて表示されるためです。と:

# to_d converts to BigDecimal, just FYI
"-0".to_d.to_s #=> "-0.0"

したがって、自分で 0 にする必要があります。しかし、符号チェックは冗長です。単純に 0 と比較するだけでうまくいきます。

bdn = "-0".to_d # or BigDecimal.new("-0")
value = bdn.zero? ? 0 : bdn
number_to_currency(value, other_options)

ただし、呼び出しているすべての場所にこのチェックを手動で追加することは望ましくありませんnumber_to_currencymodified_number_to_currency次のように、ApplicationHelper で独自のメソッドを作成する方が便利です。

def modified_number_to_currency( number, options )
  value = number.zero? ? 0 : number
  number_to_currency(value, options)
end

そして、modified_number_to_currencyの代わりに使用しnumber_to_currencyます。

または、上書きして最後number_to_currencyに呼び出すこともできます。superそれもうまくいくかもしれませんが、100%確実ではありません。

具体的にあなたのチェックに来る:

amount *= -1 if amount == 0 && amount.sign == -1

単に次のようにする必要があります。

amount = 0.to_d if amount.zero? # the to_d might or might not be required
于 2014-12-19T15:53:39.053 に答える