2010-02-13 20 views
9

"1/16" dizgisi var Float'a dönüştürmek ve 45 ile çarpmak istiyorum. Ancak, istenen sonuçları almıyorum. Böyle bir açılan sahip :rubilenin içinde bir kesir nasıl dönüştürülür

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

her kullanıcı

Ben 2.81

Büyük resmin istenilen sonucu almak nasıl script/console

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

yılında çalışıyorum oz değerini seçer ve sonra onu

ile çarpmak istiyorum

yüzden yapın:

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 sayfamda bir form göndermekten bir dize alıyorum. – ratan

cevap

10

Eğer fraksiyonunun kendinizi ayrıştırmak zorunda olacak gibi görünüyor. Bu kesirler ve tam sayılar değil, karışık sayılar üzerinde çalışacak (yani: 1 ½ çalışmaz.)

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

"1/16".to_frac * 45 
+1

'&:' ne yapar? – ratan

+3

Bazı yakut kısa el. 'map (&: method)' 'map {| obj | için çalışıyor obj.method} ' – EmFi

17

Kullanım Rasyonel

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

Bunu, float'a dönene kadar maksimum hassasiyeti koruduğundan kullanırdım. – hurikhan77

+0

Sadece yapabilirsin (Rational ("1/16") * 45) .to_f' – Cyoce

10

@Farrel haklı olduğunu ve Ruby beri 1.9 Rasyonel içerir ve Dize olan bir to_r kullanılan yöntem şeyler daha kolay şunlardır: 2.0'da bir rasyonel edebi ile daha da kolay hale

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

:

1/16r # => (1/16) 
İlgili konular