我有一个带有
的数组[1, 2, "3", "4", "1a", "abc", "a"]
1
,2
),"1"
,"2"
),"a"
,"b"
)和"1a"
,"2s"
)。由此,我只需要选择整数(包括格式化的字符串)1
,2
,"3"
,"4"
。
首先我尝试使用to_i
:
arr = [1, 2, "3", "4", "1a", "abc", "a"]
arr.map {|x| x.to_i}
# => [1, 2, 3, 4, 1, 0, 0]
但是这个会将"1a"
转换为1
,这是我不期望的。
然后我尝试了Integer(item)
:
arr.map {|x| Integer(x) } # and it turned out to be
# => ArgumentError: invalid value for Integer(): "1a"
现在我没有直接转换选项。最后,我决定采用这种方式转换价值to_i
和to_s
。因此"1" == "1".to_i.to_s
是一个整数,但不是"1a" == "1a".to_i.to_s
和"a" == "a".to_i.to_s
arr = arr.map do |x|
if (x == x.to_i.to_s)
x.to_i
else
x
end
end
和
ids, names= arr.partition { |item| item.kind_of? Fixnum }
现在我得到了整数和字符串数组。有一种简单的方法可以做到这一点吗?
答案 0 :(得分:5)
@maerics提供的类似解决方案,但有点苗条:
arr.map {|x| Integer(x) rescue nil }.compact
答案 1 :(得分:3)
class Array
def to_i
self.map {|x| begin; Integer(x); rescue; nil; end}.compact
end
end
arr = [1, 2, "3", "4", "1a", "abc", "a"]
arr.to_i # => [1, 2, 3, 4]
答案 2 :(得分:2)
类似的东西:
a = [1,2,"3","4","1a","abc","a"]
irb(main):005:0> a.find_all { |e| e.to_s =~ /^\d+$/ }.map(&:to_i)
=> [1, 2, 3, 4]
答案 3 :(得分:2)
arr=[1,2,"3","4","1a","abc","a"]
arr.map {|i| i.to_s}.select {|s| s =~ /^[0-9]+$/}.map {|i| i.to_i}
//=> [1, 2, 3, 4]
答案 4 :(得分:1)
我注意到到目前为止大部分答案都将“3”和“4”的值更改为实际整数。
>> array=[1, 2, "3", "4", "1a", "abc", "a", "a13344a" , 10001, 3321]
=> [1, 2, "3", "4", "1a", "abc", "a", "a13344a", 10001, 3321]
>> array.reject{|x| x.to_s[/[^0-9]/] }
=> [1, 2, "3", "4", 10001, 3321]
@OP,我没有详尽地测试我的解决方案,但到目前为止似乎工作(当然根据提供的样本完成),所以请自行测试。
答案 5 :(得分:1)
这个怎么样?
[1,2,"3","4","1a","abc","a"].select{|x| x.to_i.to_s == x.to_s}
# => [1, 2, "3", "4"]
答案 6 :(得分:0)
看起来很简单
arr.select{ |b| b.to_s =~ /\d+$/ }
# or
arr.select{ |b| b.to_s[/\d+$/] }
#=> [1, 2, "3", "4"]