2016-12-15 75 views
-1

如何将包含美元值的字符串以"$39,900"的格式转换为整数,以便我可以使用它进行计算?如何将包含美元金额的字符串转换为整数?

我想我会尝试gsub,但似乎并没有工作:

str = "$39,900" 
str.strip.gsub('$' '') 
=> #<Enumerator: "$39,900":gsub("$")> 

可有人请与我分享正确的方式去吗?

+1

请始终尝试询问*特定*问题并提供最少量的代码,以便重现您的问题并找到解决方案。事实上,你的字符串来自网站有**没有任何**你要问的问题,包括刮的页面的整个输出不可能有任何用处。 – meagar

+0

这不是一个Nokogiri问题。 –

回答

1

我会使用:

str = "$39,900" 
str.tr('^0-9', '').to_i # => 39900 

下面是它的分解:

str # => "$39,900" 
.tr('^0-9', '') # => "39900" 
.to_i # => 39900 

'^0-9', ''tr的意思是“代替一切那与''不是0..9,只能得到数字。

tr速度非常快,比这个用途的gsub快得多,并且非常值得了解和使用这类问题。

如果使用gsub用正则表达式坚持,这将做到这一点:

str.gsub(/\D+/, '').to_i # => 39900 

不过我还是建议使用tr。原因如下:

require 'fruity' 

str = "$39,900" 
compare do 
    _gsub { str.gsub(/\D+/, '') } 
    _tr { str.tr('^0-9', '') } 
    jason_yost { str.scan(/\d/).join('') } 
    nikita_mishain { str.tr('$,', '') } 
    ruben_tf { str.gsub(/[^\d]/, '') } 
end 

# >> Running each test 8192 times. Test will take about 2 seconds. 
# >> nikita_mishain is similar to _tr 
# >> _tr is faster than ruben_tf by 4x ± 1.0 
# >> ruben_tf is similar to _gsub 
# >> _gsub is faster than jason_yost by 2x ± 0.1 
1

.gsub('$' '') - >.gsub('$', '')(缺少一个逗号)

+0

我该如何做一个同时代替'$'和','的多重gsub? – pjw23

+0

你可以链接两个gsub子句,或者你可以使用正则表达式。 – Bek

1

str.tr('$,', '').to_i应该工作

我用#tr这里。它是如何工作的documentation

1

是最好的解释是正规表达式版本是:

str.gsub(/[^\d]/, '').to_i 

[^\d]代表“每次这不是一个数字字符”。

+0

你也可以用'/ \ D /'来匹配非数字。可能应该担心美分:耸耸肩: –

0
str = "$39,900" 
str.scan(/\d/).join('').to_i 
=> 39900 

如果字符串不包含的数字。这将返回0

str = "test" 
str.scan(/\d/).join('').to_i 
=> 0 

这将不能正确处理小数。如果你需要得到一个浮点值,你可以使用

str = '%.2f' % '$39,000.99'.delete("$").delete(',') 
str.to_f 
=> 39000.99