2011-09-18 7 views
5

Rubyでセントからドルに正しく変換したいと思っています。私はセントの分数で作業する必要はありません。BigDecimalを使用しないでRubyのセント文字をドル文字列に変換する

BigDecimalを使用せずに(浮動小数点エラーなしで)正しく行うことはできますか?

例えば、ドルセント

"99" => "0.99" 
"324" => "3.24" 

は、以下が動作しているようですが、それは正しいでしょうか?

(cents.to_i/100.0).to_s 
+0

必要な精度に依存します。あなたが円精度で大丈夫なら、お金の宝石を手に入れてください。 – Philip

答えて

3

個人的に私はこの特定のホイールを再発明しようとしないで、money gemと一緒に行きます。ドキュメント(強調追加)から:

特長

な価値とその通貨として、お金の 一定量に関するすべての情報をカプセル化するマネークラスを提供します。

通貨単位に関するすべての情報をカプセル化するMoney :: Currencyクラスを提供します。

金額を整数で表し、セントで表します。この は、浮動小数点の丸め誤差を回避します。

のように通貨を表します。高度な柔軟性を提供するMoney :: Currencyインスタンス。

通貨を別の通貨に交換するためのAPIを提供します。

対応するマネー/通貨オブジェクトに通貨と通貨文字​​列を解析する機能があります。

+0

実際にmoney gem [BigDecimalを使用](https://github.com/RubyMoney/money/blob/master/lib/money/money/arithmetic.rb)で分割を実行します。 – Philip

+0

十分です。私が言ったように、OPは私たちに彼が何をしようとしているのかをあまり教えてくれなかったが、他の誰かがすでにそれをやったとき、私は金銭のすべての複雑さに対処したくなかった。 –

8

Micheal Kohl already answered:お金の宝石を見てください。

例:

require 'money' 
Money.use_i18n = false #https://stackoverflow.com/q/31133229/676874 
puts Money.new(99, 'USD') 
puts Money.new(324, 'USD') 

次動作しているようですが、それは正しいのですか?初見で

(cents.to_i/100.0).to_s 

、それはOKですが、:

cents = '10' 
p (cents.to_i/100.0).to_s # -> '0.1' 

あなたは2桁の数字を持っていません。

オルタナティブ:

p '%.2f' % (cents.to_i/100.0) # -> '0.10' 
+7

単に「この宝石を使う」というより、解決策を提供してくれてありがとう。 –

1

あなたにも有理数の使用を検討することができます。

"%.2f" % Rational("324".to_i,100) 
#=> "3.24" 
"%.2f" % Rational("99".to_i,100) 
#=> "0.99" 
"%.2f" % Rational("80".to_i,100) 
#=> "0.80" 
"%.2f" % Rational("12380".to_i,100) 
#=> "123.80" 
4

彼らはすでにあなたが文字列操作を使用することができ刺さだと完全に数値の問題を回避した場合::

# There are, of course, all sorts of ways to do this. 
def add_decimal(s) 
    pfx = [ '0.00', '0.0', '0.' ] 
    if(pfx[s.length]) 
     s = pfx[s.length] + s 
    else 
     s = s.dup 
     s[-2, 0] = '.' 
    end 
    s 
end 

add_decimal('')  # "0.00" 
add_decimal('1')  # "0.01" 
add_decimal('12') # "0.12" 
add_decimal('123') # "1.23" 
add_decimal('1234') # "12.34" 
add_decimal('12345') # "123.45" 

ありませんしかし、私は、彼らはときにsprintf-EDを浮くように変換を取得しないのです浮動小数点、bignums、ない合理的な、何もトリッキーな、賢いものはありません。負の値に対処するには単純な変更が必要ですが、それは既に存在するものほど簡単です。

関連する問題