3

カードに課金するには、Stripeにセント単位の金額を送信する必要があります。私のアプリでは、total_price値は 10 進数、つまりドルとセントです。明らかに、100 を掛けることでこれをセントに変換できます。

total_price * 100

しかし、結果はまだ 10 進数であり、Stripe から「無効な金額」というエラーが表示されます。フロートの丸めに問題がある可能性があることはわかっています。total_priceRails で my を整数にキャストする最も安全な方法を知りたいです。お金の宝石への言及を見たことがありますが、これはこの場合に必要ですか?

4

2 に答える 2

8

Ruby には、必要に応じて、float で使用できるメソッドがいくつかあります。

  • (cart.total_price * 100).to_i (discards all decimals)
  • (cart.total_price * 100).round # .round(numofdecimals)
  • (cart.total_price * 100).floor # 1.3 => 1
  • (cart.total_price * 100).ceil # 1.3 => 2
  • (cart.total_price * 100).to_r #to rationals, e.g. 2.5 => 5/2

これが役立つことを願っています。

于 2012-09-22T19:17:39.147 に答える
-1

最初に float に変換せずに 10 進数から直接、これを行う非常に簡単な方法が実際にあります。与えられた:

decimal price = BigDecimal('100.00')

BigDecimal の fix() および frac() メソッドを使用して、最初の部分を取得し、100 を掛けて分数を加算できます。

price_in_cents = ((decimal_price.fix * 100) + decimal_price.frac).to_i

もう 1 つの一見単純な可能性は、文字列操作を使用することです。次のように、小数を文字列に変換し、ピリオドを取り除き、整数に変換できます。

price_in_cents = decimal_price.to_s.sub('.', '').to_i

しかし、ここで問題になるのは、decimal_price.to_s == '100.0' が '100.00' ではないことです。小数部にゼロ以外の数字がある場合、それらは変換で保持されますが、それ以外の場合は失われます。したがって、 decimal_price == 111.11 の場合、上記の文字列操作は期待される結果を返します。

于 2014-05-25T20:30:42.427 に答える