我的目标是转换表单输入,如“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兆字节”,以及大多数其他东西(我希望).然后它无论如何都使它成为单数版本.然后它进行乘法并吐出魔法答案.
这是合法的吗?
再次编辑:请参阅下面的答案.比我的废话更清洁.
解决方法
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]