2011-12-15 24 views

回答

6

你可能分裂成片,碎片轉化爲Rationals,總結有理數,並將結果轉換爲浮動:

s = '1 1/2' 
f = s.split.map { |r| Rational(r) }.inject(:+).to_f 
# 1.5 

如果您知道該字符串將始終有兩個部分,那麼你可以處理單獨的作品:

s = '1 1/2' 
a = s.split 
f = a.first.to_i + Rational(a.last).to_f 
# 1.5 

如果你不知道有多少零件會有(即'1''3/2''11 23/42',......都是可能的),那麼第一個應該適用於所有情況。

Kernel#Rational將引發ArgumentError如果它不能解析字符串,所以你可能要包住整個事情的begin/except塊處理錯誤。

0
s = '1 1/2' 
w, e, d = s.strip.match(/\A(\d+)?\s*(?:(\d+)\/(\d+))?\z/).to_a.drop(1).map(&:to_f) 
w + (e/d) # => 1.5