如何将包含美元金额的字符串转换为整数?

How can I turn a string containing a dollar amount into an integer?

如何将包含形式为 ",900" 的美元值的字符串转换为整数以便我可以用它执行计算?

我想我会尝试 gsub,但这似乎不起作用:

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

有人可以与我分享解决此问题的正确方法吗?

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

str.tr('$,', '').to_i 应该有效

我这里用的是#trdocumentation

中对它的工作原理进行了最好的解释

正则表达式版本为:

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

其中 [^\d] 代表 "every character that's not a number"。

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

如果字符串不包含数字,这将 return 0

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

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

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

我会使用:

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

这是它的分解方式:

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

'^0-9', '' in tr 表示“将所有不是 0..9 的内容替换为 '',结果只有数字。

tr 非常快,比 gsub 快得多,非常值得了解并用于此类问题。

如果您坚持gsub 与正则表达式一起使用,则可以这样做:

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

但是我仍然建议使用 tr。原因如下:

require 'fruity'

str = ",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