У меня есть массив [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 }
Теперь я получил массивы целых чисел и строк.Есть ли простой способ сделать это?