Perl でファイルサイズ表示を Windows ちっくにするための小さな関数+αのメモ。
ファイルサイズを 0〜999bytes、0.98K(≒1000)〜999Kbytes、0.98M(≒1000K)〜999Mbytes、
…と常に最大 3 桁で表示します。
use strict;
use warnings;
my $filesize = 123456;
printf 'filesize = %s bytes', comma ($filesize);
my @unit = ('', 'k', 'M', 'G', 'T', 'P');
my @ret = filesizenize ($filesize);
printf ' = %s%s bytes', $ret[0], $unit[$ret[1]];
exit;
;# 指定された数値に3桁毎にコンマを付与する
sub comma { my ($v) = @_; 1 while ($v =~ s/(d+)(ddd)/$1,$2/); $v; }
;# ファイルサイズ(バイト数)をWindowsちっくに正規化
sub filesizenize {
my ($p, $v) = (0, @_);
($v /= 1024., $p++) while (999 < $v);
(round ($v, 2 - int log ($v) / log 10), $p);
}
;# 指定された桁数で小数点以下($rが負数の場合は桁数)を四捨五入する
sub round { my ($v, $r) = @_; int ($v * 10 ** $r + 0.5) / 10 ** $r; }
| 999 | 999 | (999, 0)
|
| 1000 | 1,000 | (0.98, 1)
|
| 1024 | 1,024 | (1, 1)
|
| 1234 | 1,234 | (1.21, 1)
|
| 12340 | 12,340 | (12.1, 1)
|
| 123400 | 123,400 | (121, 1)
|
| 1234567 | 1,234,567 | (1.18, 2)
|