似乎String#to_i
只有当数字在字符串中领先时才有效。
作品:
"123acb".to_i #=> 123
不起作用,但我正在努力完成:
"abc123def".to_i #=> 123
我一直在寻找一种内置的方法来做到这一点,但我还没有找到。我唯一的选择是使用正则表达式吗?
- 编辑 - 哇!很多不错的选择!顺便说一句,是否有任何具体原因
to_i
只处理领先数字?
做这样的事情怎么办?
"abc123def".gsub(/\D/, '').to_i
# => 123
如果你想在一个大字符串中处理多个数字,你可以这样做
"a22bc123de4f004".split(/\D/).reject(&:empty?).map(&:to_i)
# => [22, 123, 4, 004]
这是另一种方法,使用scan
而不是split
:
>> "abc123def456ghi".scan(/\d+/).join.to_i
=> 123456
请注意,scan
保持而split
扔掉....
要回答实际问题“是否有内置方法可以做到这一点?” 您可以从Ruby String 类文档中看到没有,除非您将scan
, split
, to_i
,delete
和朋友视为“足够接近”内置。
"abc123def"[/\d+/].to_i
# => 123
另一个使用删除
"abc123def456ghi".delete("^0-9").to_i
# => 123456
下面的使用String#tr
怎么样?
"abc123def456ghi".tr('a-z','').to_i
# => 123456
"abc123def456ghiA".tr('A-z','').to_i
# => 123456