Преобразование размера файла представляет в виде строки к килобайту, эквивалентному в направляющих

Моя цель состоит в том, чтобы преобразовать вход формы, как "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 мегабайта", и большинство других вещей (я надеюсь). Это затем делает это исключительной версией независимо. Затем это делает умножение и выкладывает волшебные ответы.

Действительно ли это законно?

ОТРЕДАКТИРУЙТЕ СНОВА: См. ответ ниже. Намного более чистый, чем моя ерунда.

5
задан Evan Walsh 30 June 2010 в 00:33
поделиться

3 ответа

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
  • Добавлен ? для необязательного множественного числа в регулярном выражении.
  • @sizes заменен на строку множественного числа.
  • Преобразуйте m [1] (число в число с плавающей запятой).
  • Отправить сообщение m [2] напрямую
3
ответ дан 14 December 2019 в 04:29
поделиться

Прежде всего, изменение регулярного выражения на @regex = / ([0-9] +) (. *?) S? / устранит проблему множественного числа. ? говорит, что соответствует 0 или 1 символу для 's', и заставляет. * соответствовать не жадным образом (как можно меньше символов).

Что касается размера, у вас может быть такой хэш:

@hash = { 'kilobyte' => 1, 'megabyte' => 1024, 'gigabyte' => 1024*1024}

и тогда ваш расчет будет просто self.quota = m [1] .to_i * @ hash [m2]

РЕДАКТИРОВАТЬ: Изменено значения в базе 2

0
ответ дан 14 December 2019 в 04:29
поделиться

почему бы вам просто не создать хэш, который содержит различные варианты написания множителя в качестве ключа и числового значения в качестве значения? Нет необходимости в eval и регулярных выражениях!

1
ответ дан 14 December 2019 в 04:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: