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; }
$i | comma ($i) | filesizenize ($i) |
---|---|---|
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) |