如何将包含美元金额的字符串转换为整数?
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
应该有效
我这里用的是#tr
。 documentation
中对它的工作原理进行了最好的解释
正则表达式版本为:
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
如何将包含形式为 ",900"
的美元值的字符串转换为整数以便我可以用它执行计算?
我想我会尝试 gsub
,但这似乎不起作用:
str = ",900"
str.strip.gsub('$' '')
=> #<Enumerator: ",900":gsub("$")>
有人可以与我分享解决此问题的正确方法吗?
.gsub('$' '')
--> .gsub('$', '')
(缺少逗号)
str.tr('$,', '').to_i
应该有效
我这里用的是#tr
。 documentation
正则表达式版本为:
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