2011-12-15 2 views

ответ

6

Вы могли бы разделить на куски, конвертировать штук в Rationals, просуммировать Рациональные и преобразовать результат в Float:

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 
Смежные вопросы