Моя цель состоит в том, чтобы преобразовать вход формы, как "100 мегабайтов" или "1 гигабайт", и преобразовывает его в размер файла в килобайтах, которые я могу сохранить в базе данных. В настоящее время у меня есть это:
def quota_convert
@regex = /([0-9]+) (.*)s/
@sizes = %w{kilobyte megabyte gigabyte}
m = self.quota.match(@regex)
if @sizes.include? m[2]
eval("self.quota = #{m[1]}.#{m[2]}")
end
end
Это работает, но только если вход является кратным ("гигабайты", но не "гигабайт") и кажется безумно небезопасным из-за использования eval
. Так, функциональный, но я не буду спать хорошо сегодня вечером.
Руководство?
Править:------
Хорошо. По некоторым причинам, regex с (.*?) не работает правильно над моей установкой, но я работал вокруг этого с материалом направляющих. Кроме того, я понял, что байты работали бы лучше на меня.
def quota_convert
@regex = /^([0-9]+\.?[0-9]*?) (.*)/
@sizes = { 'kilobyte' => 1024, 'megabyte' => 1048576, 'gigabyte' => 1073741824}
m = self.quota.match(@regex)
if @sizes.include? m[2].singularize
self.quota = m[1].to_f*@sizes[m[2].singularize]
end
end
Это ловит "1 мегабайт", "1,5 мегабайта", и большинство других вещей (я надеюсь). Это затем делает это исключительной версией независимо. Затем это делает умножение и выкладывает волшебные ответы.
Действительно ли это законно?
ОТРЕДАКТИРУЙТЕ СНОВА: См. ответ ниже. Намного более чистый, чем моя ерунда.
def quota_convert
@regex = /([0-9]+) (.*)s?/
@sizes = "kilobytes megabytes gigabytes"
m = self.quota.match(@regex)
if @sizes.include? m[2]
m[1].to_f.send(m[2])
end
end
?
для необязательного множественного числа в регулярном выражении. Прежде всего, изменение регулярного выражения на @regex = / ([0-9] +) (. *?) S? /
устранит проблему множественного числа. ? говорит, что соответствует 0 или 1 символу для 's', и заставляет. * соответствовать не жадным образом (как можно меньше символов).
Что касается размера, у вас может быть такой хэш:
@hash = { 'kilobyte' => 1, 'megabyte' => 1024, 'gigabyte' => 1024*1024}
и тогда ваш расчет будет просто self.quota = m [1] .to_i * @ hash [m2]
РЕДАКТИРОВАТЬ: Изменено значения в базе 2
почему бы вам просто не создать хэш, который содержит различные варианты написания множителя в качестве ключа и числового значения в качестве значения? Нет необходимости в eval и регулярных выражениях!