我有一个字符串input = "2 + 3"
,我想将其转换为"2.0 + 3.0"
。我用以下两种复杂的方法实现了这个目标:
floats = input.scan(/\d+/).map(&:to_f)
operator = input.scan(/[+,\-,*,\/]/)
operator.unshift(floats.first.to_s)
.push(floats.last.to_s).join(' ')
#=> "2.0 + 3.0"
或:
input.split(/\s+/)
.map{|i| ['+','-','*','/'].include?(i) ? i : i.to_f }
.join(' ')
#=> "2.0 + 3.0"
有更简单或更好的方法吗?
答案 0 :(得分:8)
我假设您正在讨论仅转换整数,而所有其他答案都假定该字符串仅包含整数。我会选择:
'1.0 + 2/4.5 - 15'.gsub(/(?<![\.\d])\d+(?![\.\d])/) { |m| "#{m}.0" }
#⇒ "1.0 + 2.0/4.5 - 15.0"
答案 1 :(得分:2)
你也可以尝试这个
> "2 + 3".scan(/\d+/).map(&:to_f).join(" + ")
=> "2.0 + 3.0"
在得到@sergio的建议后,我尝试将其作为一个gsub来启发上述@mudasobwa答案..
> "2 + 3/4.5".gsub(/(?<!\.)\b[0-9]+\b(?!\.)/) {|i| i.to_f}
=> "2.0 + 3.0/4.5"
也测试
> "25 + 13/4.5".gsub(/(?<!\.)\b[0-9]+\b(?!\.)/) {|i| i.to_f}
=> "25.0 + 13.0/4.5"
答案 2 :(得分:1)
正则表达式替换确实有助于此:
floats = input.gsub(/(\d+)/, '\1.0')
(\d+)
捕获任何数字并将其放在第一个捕获组中。 \1
返回第一个捕获组(即该数字)。
答案 3 :(得分:1)
<强>代码强>
def floatasize(str)
str.gsub(/\d+(?:\.\d+)?/) { |s| s.include?('.') ? s : "#{s}.0" }
end
<强>实施例强>
floatasize '1.0 + 2/4.5 - 15'
#=> "1.0 + 2.0/4.5 - 15.0"
floatasize '-1 + 2/-4.5 - 15'
#=> "-1.0 + 2.0/-4.5 - 15.0"
floatasize 'The expression is -1 + 2/-4.5 - 15.'
#=> "The expression is -1.0 + 2.0/-4.5 - 15."
<强>解释强>
正则表达式读取,“匹配一个或多个数字,可选地后跟小数点,然后是一个或多个数字”。请注意,在上一个示例中,正则表达式与"15"
匹配,而不是"15."
。
也可以写出块
{ |s| "#{s}.0".to_f.to_s }
如果gsub
将"15"
传递给了区块(s #=> "15"
),
"#{"15"}.0".to_f.to_s
#=> "15.0".to_f.to_s
#=> 15.0.to_s
#=> "15.0"
如果gsub
将"4.5"
传递给了区块(s #=> "4.5"
),
"#{"4.5"}.0".to_f.to_s
#=> "4.5.0".to_f.to_s
#=> 4.5.to_s
#=> "4.5"