如何检查数组是否包含整数或整数字符串

时间:2015-08-17 07:17:33

标签: arrays ruby

我收到了api的请求。参数可以是["3456", "567564"](表单数据)或"45643, 45645, 45645"(json)之类的数组。这些参数直接发送到sql请求。我必须检查用户是否只发送了整数;否则SQL将崩溃:> ERROR: invalid input syntax for integer: "8939f"

目前,我有这个:

def valid_group_params?
  group_ids_to_add = params[:group]['group_ids_to_add']
  group_ids_to_remove = params[:group]['group_ids_to_remove']
  if group_ids_to_add && group_ids_to_remove
    group_ids = group_ids_to_add + group_ids_to_remove
    if group_ids.is_a? Array
      group_ids = group_ids * ","
    else
      group_ids = group_ids_to_add + ',' + group_ids_to_remove
    end
    group_ids.split(',').all? {|x| x !~ /\D/ }
  end
end

但我不喜欢那么多。有没有更好的方法呢?

4 个答案:

答案 0 :(得分:3)

只需使用to_i将字符串转换为整数。

根据官方文件:

  

忽略有效数字末尾之外的字符。如果   在str的开头没有有效数字,返回0。

例如:

"45643".to_i
# => 45643
"8939f".to_i
# => 8939 
"99 red balloons".to_i 
# => 99

即使这还不够,您也可以使用正则表达式:

"some1221text"[/\d+/]
# => "1221"

答案 1 :(得分:3)

我不确定我是否理解这个问题,特别是在阅读了其他答案之后。这会有帮助吗?

def all_digits?(params)
  case params
  when Array
    params
  when String
    params.split /,\s+/
  else
    # raise exception
  end.all? { |e| e =~ /^\d+$/ }
end

to_add = params[:group]['group_ids_to_add']
to_remove = params[:group]['group_ids_to_remove']
to_add && to_remove && all_digits?(to_ad) && all_digits?(to_remove)

案例1

to_add    = ["123", "456"]
to_remove = ["789", "0cat"]

to_add && to_remove && all_digits?(to_add) && all_digits?(to_remove)
  #=> ["123", "456"] && ["789", "0cat"] && true && false
  #=> false

案例2

to_add    = "123", "456"
to_remove = "789", "0cat"
to_add && to_remove && all_digits?(to_add) && all_digits?(to_remove)
  #=> "123", "456" && "789", "0cat" && true && false
  #=> false

答案 2 :(得分:2)

使用to_i方法。

foo = "3456"
foo.to_i

答案 3 :(得分:2)

使用全局方法Kernel#Integer

Integer("123")    # => 123
Integer(123)      # => 123

这很像#to_i,因为它会将字符串转换为整数并保持整数不变。但是,与#to_i不同,如果#Integer的参数不表示整数,则会引发错误:

Integer("abc")    # => ArgumentError: invalid value for Integer(): "abc"