2016-04-30 7 views
4

Wie konvertiere ich eine Zeichenfolge mit einem Dollar-Betrag wie "5.32" oder "100" zu einer ganzen Zahl in Cent wie 532 oder 10000?Ruby: Konvertieren Dollar (String) in Cent (Integer)

Ich habe eine Lösung unter:

dollar_amount_string = "5.32" 
dollar_amount_bigdecimal = BigDecimal.new(dollar_amount_string) 
cents_amount_bigdecimal = dollar_amount_bigdecimal * BigDecimal.new(100) 
cents_amount_int = cents_amount_bigdecimal.to_i 

aber es scheint wackelig. Ich möchte sicher sein, da dies eine Eingabe für die PayPal-API sein wird.

Ich habe auch das Geld Juwel versucht, aber es war nicht in der Lage, Strings als Eingaben zu nehmen.

+1

Ich sehe nichts falsch mit Ihrer Lösung. 'require 'bigdecimal'; (100 * BigDecimal.new ("5,32")). To_i # => 532; (100 * BigDecimal.new ("12")). To_i # => 1200'. Beachten Sie, dass '100 * BigDecimal.new (" 5.32 ")' eine große Dezimalzahl ist, genauso wie '2 * 3.1 # => 6.2' ein 'Float' ist. –

Antwort

13

können Sie verwenden String#to_r ("rational") Rundungsfehler zu vermeiden.

def dollars_to_cents(dollars) 
    (100 * dollars.to_r).to_i 
end 

dollars_to_cents("12") 
    #=> 1200 
dollars_to_cents("10.25") 
    #=> 1025 
dollars_to_cents("-10.25") 
    #=> -1025 
dollars_to_cents("-0") 
    #=> 0 
3
d, c = dollar_amount_string.split(".") 
d.to_i * 100 + c.to_i # => 532 
+2

Das ist cool. Leser; "d, c =" 100 ".split (". ") # => [" 100 "]', also 'd # =>" 100 "', 'C# => nil'.' "100". to_i * 100 + nil.to_i # => 10000 + 0 # => 10000'. –

+1

Nicht so schnell. '10.0020' wird als 1020 angezeigt. Sie müssen diese Nachkommastellen einhalten. Bruchstücke werden als Ergebnis angezeigt einige Berechnungen – tadman

+0

@tadman Ich habe nicht einen Preis wie das gesehen Ist das ein gültiger Preis? – sawa