Преобразование строки размера файла в килобайтный эквивалент в Rails - PullRequest
5 голосов
/ 30 июня 2010

Моя цель - преобразовать ввод формы, например, «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.Итак, функционально, но я не буду хорошо спать сегодня вечером.

Любое руководство?

РЕДАКТИРОВАТЬ: ------

Хорошо.По какой-то причине регулярное выражение с (. *?) Не работает правильно на моей установке, но я обошел это с помощью Rails.Кроме того, я понял, что байты будут работать лучше для меня.

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

Это законно?

ИЗМЕНИТЬ СНОВА: см. Ответ ниже.Гораздо чище, чем моя чепуха.

Ответы [ 4 ]

4 голосов
/ 07 октября 2013

Вы можете использовать Rails ActiveHelper number_to_human_size .

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

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

0 голосов
/ 30 июня 2010

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

Что касается размера, вы можете иметь хэш-подобиеэто:

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

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

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

...