5

我的目标是转换表单输入,如“100 MB”或“1 GB”,并将其转换为可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:

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 回答 4

4

您可以使用 Rails ActiveHelper number_to_human_size

于 2013-10-07T15:12:50.230 回答
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]
于 2010-06-30T00:29:18.700 回答
1

为什么不简单地创建一个哈希,其中包含乘数的各种拼写作为键,数值作为值?不需要评估,也不需要正则表达式!

于 2010-06-30T00:04:41.437 回答
0

首先,将您的正则表达式更改为@regex = /([0-9]+) (.*?)s?/将解决复数问题。这 ?表示匹配 's' 的 0 或 1 个字符,它会导致 .* 以非贪婪的方式匹配(尽可能少的字符)。

至于大小,你可以有这样的哈希:

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

然后你的计算就是self.quota = m[1].to_i*@hash[m2]

编辑:将值更改为基数 2

于 2010-06-30T00:08:12.177 回答