2010-02-13 11 views
9

Ho una stringa "1/16" Voglio convertirlo in float e moltiplicarlo per 45. Tuttavia, non ottengo i risultati desiderati.come convertire una frazione in galleggiante in rubino

sto cercando in script/console

>> "1/16".to_f 
=> 1.0 
>> "1/16".to_f*45 
=> 45.0 

come posso ottenere il risultato desiderato di 2.81

Bigger immagine: Ho una goccia giù come questo:

<%=select_tag :volume, options_for_select(["", "1 g", "1/16 oz", "1/8 oz","1/4 oz", 
"1/2 oz", "1 oz", "1/8 lb", "1/4 lb", "Single", "Multi 5" ], "N/A") %> 

ogni volta utente seleziona il valore oz quindi lo voglio moltiplicare a 45

così faccio:

first, *rest = params[:volume].to_s.split(/ /) 
if rest.first=="oz" 
    @indprodprice = @prods.orig_price.to_i*first.to_f*28.3495 
else 
    @indprodprice = @prods.orig_price.to_i*first.to_f*453.59237 
end 
+0

non posso. sto ricevendo una stringa dall'invio di un modulo nella mia pagina html. – ratan

risposta

10

sembra che stai andando ad avere per analizzare la frazione da soli. Ciò funzionerà sulle frazioni e numeri interi, ma non numeri misti (vale a dire: 1 ½ non funzionerà.)

class String 
    def to_frac 
    numerator, denominator = split('/').map(&:to_f) 
    denominator ||= 1 
    numerator/denominator 
    end 
end 

"1/16".to_frac * 45 
+1

cosa fa '&:' do? – ratan

+3

È una mano corta color rubino. 'map (&: method)' funziona con 'map {| obj | obj.method} ' – EmFi

17

uso razionale

>> (Rational(*("1/16".split('/').map(&:to_i)))*45).to_f 
=> 2.8125 
+0

Lo userei perché mantiene la massima precisione finché non si converte in float. – hurikhan77

+0

Si può semplicemente fare '(Rational (" 1/16 ") * 45) .to_f' – Cyoce

10

@Farrel aveva ragione, e dal momento che Ruby 1.9 include Rational e stringa ha una to_r cose -Metodo sono più facili:

puts ("1/16".to_r * 45).to_f #=> 2.8125 
puts ("1/16".to_r * 45).to_f.round(2) #=> 2.81 

In 2.0 è diventato ancora più facile con un letterale razionale:

1/16r # => (1/16) 
Problemi correlati