Ruby: Лучший способ преобразовать строку в целое или оставить ее как строку, если это необходимо? - PullRequest
2 голосов
/ 20 сентября 2010

При разработке небольшого веб-приложения для опроса возникла проблема, связанная с диапазонами для вопросов типа рейтинга.Таким образом, диапазон рейтинга может быть:

1..10
-5..0
-5..5
'a'..'z'
'E'..'M'

и т. Д.

Диапазон сохраняется в виде пары вариантов в базе данных (начало и конец диапазона).Таким образом, диапазон всегда начинается со строкового ввода.

Каков наилучший способ взять эти строковые значения и соответственно построить диапазон Ruby.Я не могу просто перейти на value.to_i, так как это не сработает для итерации строк.Имея кучу если кажется уродливым.Есть ли лучший способ?

Не так важно, но стоит спросить: а что, если я хочу, чтобы все это работало с обратным диапазоном?Скажите 5-к-0 или G-к-A.Я знаю, что Ruby не поддерживает обратный диапазон (поскольку он использует succ () для итерации).Что было бы лучше всего здесь?

Заранее спасибо!

Обновление:

На основании предложения Вутера де Би я согласился на это:

def to_int_or_string(str)
  return str.match(/^-?\d+$/) ? str.to_i : str.strip
end

def ratings_array(from, to)
  from = to_int_or_string(from)
  to = to_int_or_string(to)
  from > to ? Range.new(to, from).to_a.reverse : Range.new(from, to).to_a
end

Есть мысли?

Ответы [ 2 ]

2 голосов
/ 20 сентября 2010

Использовать Range.new:

Range.new("a","z")
=> "a".."z"

Range.new(-5,5)
=> -5..5

Если вы храните в кавычках цитаты, вы можете использовать eval для получения правильных диапазонов:

from = "'a'"
to = "'z'"
eval("Range.new(#{from},#{to})")

В противном случае вы можете использовать значение.to_i, чтобы выяснить, было ли это число или строка в varchar:

a = "x"
a = (a.to_i == 0 && a != "0") ? a : a.to_i
=> "x"

a = "5"
a = (a.to_i == 0 && a != "0") ? a : a.to_i
=> 5

Что, конечно, можно извлечь из метода:

def to_int_or_string(value)
  return (value.to_i == 0 && value != "0") ? value : value.to_i
end

def to_range(from, to)
  return Range.new(to_int_or_string(from), to_int_or_string(to))
end

Чтобы изменить диапазон,сначала нужно преобразовать его в массив:

Range.new("a","g").to_a.reverse
=> ["g", "f", "e", "d", "c", "b", "a"]
0 голосов
/ 20 сентября 2010

Вы можете сделать что-то вроде следующего.

str = 'Z..M'

v1 = str[0,str.index('.')]
v2 = str[str.index('.')+2, str.length]

unless v1.to_i == 0
  v1 = v1.to_i
  v2 = v2.to_i
end

if v2>v1
  final_arr = (v1..v2).to_a
else
  final_arr = (v2..v1).to_a.reverse
end

puts final_arr

Это касается как положительного, так и отрицательного диапазонов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...