5

私の目的は、「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メガバイト」、およびその他のほとんどのものをキャッチします(願っています)。その後、関係なく単数形になります。次に、掛け算を行い、魔法の答えを吐き出します。

これは合法ですか?

再度編集: 以下の回答を参照してください。私のナンセンスよりもはるかにきれいです。

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 に答える