得到&存储字符串中的数字

时间:2014-11-18 21:30:41

标签: ruby-on-rails ruby ruby-on-rails-4

我有一串这样的值:

=> "[\"3\", \"4\", \"60\", \"71\", \"49\", \"62\", \"9\", \"14\", \"17\", \"63\"]"

我想将每个值放在一个数组中,以便我可以使用每个值。所以像这样:

@numbers =>["72", "58", "49", "62", "9", "13", "17", "63"]

这是我想在字符串是可用数组时使用的代码:

@numbers.each do |n| 
  @answers << Answer.find(n)
end

我尝试使用split(),但字符的每一边都没有平衡字符。我也试图使用正则表达式split(/\D/),但我认为我的想法越来越差。

控制器:

@scores = []
  @each_answer = []
  @score.answer_ids.split('/').each do |a| 
    @each_answer << Answer.find(a).id
  end

@score.answer_ids的位置:

=> "[\"3\", \"4\", \"60\", \"71\", \"49\", \"62\", \"9\", \"14\", \"17\", \"63\"]"

3 个答案:

答案 0 :(得分:3)

看起来像一个JSON字符串数组。您可以使用Ruby's built-in JSON library来解析它,然后将数组的元素映射到整数:

input = "[\"3\", \"4\", \"60\", \"71\", \"49\", \"62\", \"9\", \"14\", \"17\", \"63\"]"

require 'json'
ids = JSON.parse(input).map(&:to_i)

@answers += Answer.find(ids)

答案 1 :(得分:2)

我会用:

foo = "[\"3\", \"4\", \"60\", \"71\", \"49\", \"62\", \"9\", \"14\", \"17\", \"63\"]"
foo.scan(/\d+/) # => ["3", "4", "60", "71", "49", "62", "9", "14", "17", "63"]

如果你想要整数而不是字符串:

foo.scan(/\d+/).map(&:to_i) # => [3, 4, 60, 71, 49, 62, 9, 14, 17, 63]

如果数据来自您的系统内部,并且不是用户从互联网上输入的结果,那么您可以做一些简单的事情:

bar = eval(foo) # => ["3", "4", "60", "71", "49", "62", "9", "14", "17", "63"]

将执行字符串的内容,就好像它是Ruby代码一样。如果输入来自您尚未擦除的用户输入,则不希望这样做。

答案 2 :(得分:1)

在您的代码中 n 是一个字符串,而不是一个整数。 #find方法需要一个Integer,因此您需要在迭代之前将String转换为整数数组。例如:

str = "[\"3\", \"4\", \"60\", \"71\", \"49\", \"62\", \"9\", \"14\", \"17\", \"63\"]"
str.scan(/\d+/).map(&:to_i).each do |n|
    @answers << Answer.find(n)
end