2010-02-13 10 views
9

Tengo una cadena "1/16" Quiero convertirla en flotar y multiplicarla por 45. Sin embargo, no obtengo los resultados deseados.cómo convertir una fracción a flotar en rubí

Estoy tratando de script/console

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

¿Cómo puedo obtener el resultado deseado de 2.81

Bigger Picture: Tengo un menú desplegable de la siguiente manera:

<%=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") %> 

cada vez que el usuario selecciona el valor oz y luego quiero multiplicarlo a 45

por lo que:

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

i cant. Estoy recibiendo una cadena de enviar un formulario en mi página html. – ratan

Respuesta

10

Parece que vas a tener que analizar la fracción mismo. Esto funcionará en fracciones y números enteros, pero no números mixtos (es decir: 1½ no funcionará.)

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

"1/16".to_frac * 45 
+1

¿Qué hace '&:' hacer? – ratan

+3

Es una mano corta de rubí. 'map (&: method)' funciona para 'map {| obj | obj.method} ' – EmFi

17

Uso Racional

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

Lo usaría ya que mantiene la máxima precisión hasta que se convierte en flotación. – hurikhan77

+0

Puedes hacer '(Rational (" 1/16 ") * 45) .to_f' – Cyoce

10

@Farrel era correcto, y desde Ruby 1.9 incluye Rational y cadena tiene un to_r cosas son más fáciles -Método:

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

En 2.0 se hizo aún más fácil con un literal racional:

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