24

バイトを表す整数を「きれいな」形式の文字列に変換するメソッドを作成しようとしています。

これが私の半分の試みです:

class Integer
  def to_filesize
    {
      'B'  => 1024,
      'KB' => 1024 * 1024,
      'MB' => 1024 * 1024 * 1024,
      'GB' => 1024 * 1024 * 1024 * 1024,
      'TB' => 1024 * 1024 * 1024 * 1024 * 1024
    }.each_pair { |e, s| return "#{s / self}#{e}" if self < s }
  end
end

私は何を間違っていますか?

4

7 に答える 7

35

Rails で使用する場合 - 標準の Rails 数値ヘルパーはどうですか?

http://api.rubyonrails.org/classes/ActionView/Helpers/NumberHelper.html#method-i-number_to_human_size

number_to_human_size(number, options = {})

?

于 2014-01-31T00:34:04.107 に答える
26

Filesize gem はどうですか? バイト(およびその他の形式)からきれいに印刷された値に変換できるようです:

例:

Filesize.from("12502343 B").pretty      # => "11.92 MiB"

http://rubygems.org/gems/filesize

于 2013-04-15T23:09:08.780 に答える
3

を使用した方法は次のlog10とおりです。

def number_format(d)
   e = Math.log10(d).to_i / 3
   return '%.3f' % (d / 1000 ** e) + ['', ' k', ' M', ' G'][e]
end

s = number_format(9012345678.0)
puts s == '9.012 G'

https://ruby-doc.org/core/Math.html#method-c-log10

于 2020-11-17T19:37:49.930 に答える
1

Integer にメソッドを追加するとポイントが得られますが、これはよりファイル固有のように思われるため、.prettysize() というメソッドを File に追加するなど、File を操作することをお勧めします。

しかし、反復を使用し、単一バイトを浮動小数点数として出力することを回避する代替ソリューションを次に示します:-)

def format_mb(size)
  conv = [ 'b', 'kb', 'mb', 'gb', 'tb', 'pb', 'eb' ];
  scale = 1024;

  ndx=1
  if( size < 2*(scale**ndx)  ) then
    return "#{(size)} #{conv[ndx-1]}"
  end
  size=size.to_f
  [2,3,4,5,6,7].each do |ndx|
    if( size < 2*(scale**ndx)  ) then
      return "#{'%.3f' % (size/(scale**(ndx-1)))} #{conv[ndx-1]}"
    end
  end
  ndx=7
  return "#{'%.3f' % (size/(scale**(ndx-1)))} #{conv[ndx-1]}"
end
于 2014-05-22T20:53:49.033 に答える