-1 -> <1K 0 -> 1 -> <1K 10 -> <1K 100 -> <1K 511 -> <1K 512 -> 1K 513 -> 1K 999 -> 1K 1000 -> 1K 1023 -> 1K 1024 -> 1K 1025 -> 1K 10000 -> 10K 100000 -> 98K 1000000 -> 977K 10000000 -> 9766K 100000000 -> 95M 1000000000 -> 954M 10000000000 -> 9537M 100000000000 -> 93G 1000000000000 -> 931G 10000000000000 -> 9313G 100000000000000 -> 93132G 1000000000000000 -> 931323G #### for my $amount( qw/-1 0 1 10 100 511 512 513 999 1000 1023 1024 1025 10000 100000 1000000 10000000 100000000 1000000000 10000000000 100000000000 1000000000000 10000000000000 100000000000000 1000000000000000/ ) { print "$amount -> ", amount($amount), "\n"; } #### sub amount { my $num = shift; return '' if $num < 0; return '0K' if $num == 0; return '<1K' if $num < 1024; my @suffix = qw/K M G T P/; my $offset = -1; while( $num >= 1024 and $offset < scalar @suffix ) { ++$offset; $num = int( $num / 1024 ); } return "$num$suffix[$offset]"; }