在 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 中将文件大小字符串转换为等效千字节的主要内容,如果未能解决你的问题,请参考以下文章