ruby-on-rails – 在Rails中将filesize字符串转换为千字节等价物

我的目标是转换表单输入,如“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]

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...