有没有一种简单的方法可以将数字转换为字符串中的浮点数?

时间:2016-07-29 06:18:09

标签: ruby regex

我有一个字符串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"

有更简单或更好的方法吗?

4 个答案:

答案 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"