2010-02-13 83 views
9

我有一个字符串"1/16"我想将其转换为浮点数乘以45。但是,我没有得到理想的结果。如何将分数转换为浮点数在红宝石中

我想在script/console

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

我怎样才能得到2.81

大局观所期望的结果: 我有一个下拉这样的:

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

每当用户选择oz价值然后我想它乘以45

,所以我做的:

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

我不能。我得到一个字符串从我的HTML页面提交表单。 – ratan 2010-02-14 00:00:49

回答

10

看起来像你将不得不自己分析的分数。这将在分数和整数,但不带分数工作(即:1.5将无法正常工作。)

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

"1/16".to_frac * 45 
+1

'&:'做什么? – ratan 2010-02-14 00:41:17

+3

这是一些红宝石短手。 map(&:method)'map {| obj | obj.method}' – EmFi 2010-02-14 01:35:58

17

使用Rational

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

我会使用它,因为它保持最大的精度,直到你转换为浮动。 – hurikhan77 2010-02-14 13:17:24

+0

你可以做'(Rational(“1/16”)* 45).to_f' – Cyoce 2017-10-26 22:24:32

10

@Farrel是正确的,而且由于Ruby 1.9的包括Rational和串有to_r - 方法事情更容易:

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

在2.0成为即使有理性的文字更容易:

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