在 Rails 中将文件大小字符串转换为等效千字节

Posted

技术标签:

【中文标题】在 Rails 中将文件大小字符串转换为等效千字节【英文标题】:Converting filesize string to kilobyte equivalent in Rails 【发布时间】:2010-06-30 00:02:15 【问题描述】:

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

def quota_convert
  @regex = /([0-9]+) (.*)s/
  @sizes = %wkilobyte megabyte gigabyte
  m = self.quota.match(@regex)
  if @sizes.include? m[2]
    eval("self.quota = #m[1].#m[2]")
  end
end

这可行,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”),并且由于使用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 兆字节”和大多数其他内容(我希望如此)。然后,无论如何,它都使它成为单数版本。然后它会进行乘法运算并给出神奇的答案。

这是合法的吗?

再次编辑:请参阅下面的答案。比我的废话干净得多。

【问题讨论】:

【参考方案1】:

您可以使用 Rails ActiveHelper number_to_human_size。

【讨论】:

此答案将数字转换为字符串。它与问题无关。【参考方案2】:
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]

【讨论】:

哇。这真的很完美。非常感谢。 太干净了。 如果您想要的是 clean,那么将该功能移至 String#bytes 并调用 self.quota.bytes【参考方案3】:

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

【讨论】:

问题是我想考虑所有情况(“550 兆字节”、“1.5 千兆字节”等),如果我这样做的话,哈希值会很荒谬。我宁愿将转换部分交给 Rails。我只需要把它全部解析出来......不知何故...... 重点是您可以将数值读取为数字,并让哈希包含乘法因子(kb、gb、mb 等)【参考方案4】:

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

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

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

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

编辑:将值更改为基数 2

【讨论】:

另外,考虑到诸如“1.5 KB”之类的值,您的正则表达式将是 @regex = /([0-9]+\.?[0-9]*?) (.*?)s?/。在这种情况下,您需要将计算更改为 m[1].to_f 以将字符串转换为浮点值

以上是关于在 Rails 中将文件大小字符串转换为等效千字节的主要内容,如果未能解决你的问题,请参考以下文章

将人类可读的文件大小转换为 ruby​​ 中的字节

在Java中将字节大小转换为人类可读的格式?

如何在Go中将字节数组转换为字符串[重复]

在python中将字符串转换为数字[关闭]

如何在 Spring MVC 中将字节数组转换为 ZipOutputStream?

在rails中将字符串转换为数组