将数字转换为K / M / G / T和天/小时/分钟?

时间:2013-06-14 16:17:36

标签: perl

是否有一种简单的方法来转换像这样的数字

123           ->   123B
1234          ->   1.2K
12345         ->  12.2K
123456        -> 123.4K
1234567       ->   1.2M
12345678      ->  12.3M
123456789     -> 123.4M
...

理想情况下也是大数天/小时/分钟。 ?

2 个答案:

答案 0 :(得分:1)

实际上,一旦我们理解了字母 K,M,G,T 与它们所呈现的因素之间的关系,后缀实际上非常简单:

K = 10^3  = 10^3^1
M = 10^6  = 10^3^2
G = 10^9  = 10^3^3
T = 10^12 = 10^3^4

要实现的下一个重要事项是10^0 = 1

我们想要选择其值小于我们想要转换的值的最大后缀。为此,我们将后缀放入数组中:

my @suffixes = qw/ B K M G T /;

这样

$suffixes[$i] == 10**3**$i   # conceptually

现在只需循环索引(可能在reverse中)并在$val >= 10**3**$i后立即停止。

答案 1 :(得分:1)

对此进行了讨论on Stackoverflow using Time::Piece。其中一个答案接近计算天数小时分钟。从我之前读过的关于这个问题的内容来看,我认为你可以像这样轻松编写代码:

sub dhms {
    my $seconds = shift;
    my $days = int $seconds / 86400;
    $seconds %= 86400;
    my $hours = int $seconds / 3600;
    $seconds %= 3600;
    my $mins = int $seconds / 60;
    my $secs = $seconds % 60;
    return $days, $hours, $mins, $secs;
}

更新:daxim的回答使用DateTime :: Format :: Duration也可以这样做