Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

Mathライブラリとcase文をつかって、桁の接尾辞(kとかMとか)を出す

Math#log10について

Math#log10は、その名の通り与えられた数値にlog10を適用した結果を出すメソッドです。

Math.log10(12_345_678)
#>> 7.091514945509202

元の数値を3(=log10(1000))で割った結果を与えると……

(Math.log10(12_345_678) / 3)
#>> 2.3638383151697338

そして、これをto_iすると、小数点以下が捨てられ桁数だけが出てきます。

Math.log10(12_345_678 / 3).to_i
#>> 2

本題

と、上記を踏まえ数値を出した上で再度検証します。
この結果をcase文に適用すれば、アラ不思議。
あっという間に桁の接尾辞を出すメソッドができました。

    module Helpers
      def scale(value)
        scale = (Math.log10(value) / 3).to_i
        suffix = case scale
        when 1; 'k'
        when 2; 'M'
        when 3; 'B'
        when 4; 'T'
        when 5; 'Q'
        else
          # < 1000 or > 10^15, no scale or suffix
          scale = 0
          ' '
        end
        "%10.3f#{suffix}" % (value.to_f / (1000 ** scale))
      end
      module_function :scale
    end