2010-02-13 15 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

मैं नहीं कर सकता। मुझे अपने एचटीएमएल पेज में एक फॉर्म जमा करने से स्ट्रिंग मिल रही है। – ratan

उत्तर

10

लगता है कि आपने अंश अपने आप को पार्स करने के लिए करने जा रहे हैं की तरह। यह भिन्न और पूर्ण संख्याओं, लेकिन नहीं मिश्रित संख्या पर काम करेंगे (यानी: 1½ काम नहीं करेगा।)

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

"1/16".to_frac * 45 
+1

'&:' क्या करता है? – ratan

+3

यह कुछ रूबी छोटा हाथ है। 'मानचित्र (&: विधि) 'मानचित्र पर काम करता है {| obj | obj.method} ' – EmFi

17

उपयोग वाजिब

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

मैं इसका उपयोग करता हूं क्योंकि जब तक आप फ्लोट में परिवर्तित नहीं होते हैं, तब तक यह अधिकतम सटीकता रखता है। – hurikhan77

+0

आप बस '(तर्कसंगत ("1/16") * 45) कर सकते हैं .to_f' – Cyoce

10

@Farrel सही था, और रूबी के बाद से 1.9 वाजिब भी शामिल है और एक स्ट्रिंग है to_r -method चीजों को आसान कर रहे हैं:

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)