有没有一种简单的方法来转换像这样的数字
123 -> 123B
1234 -> 1.2K
12345 -> 12.2K
123456 -> 123.4K
1234567 -> 1.2M
12345678 -> 12.3M
123456789 -> 123.4M
...
理想情况下也是天/小时/分钟的大数字。?
有没有一种简单的方法来转换像这样的数字
123 -> 123B
1234 -> 1.2K
12345 -> 12.2K
123456 -> 123.4K
1234567 -> 1.2M
12345678 -> 12.3M
123456789 -> 123.4M
...
理想情况下也是天/小时/分钟的大数字。?
后缀实际上很简单,一旦我们了解了字母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
.
这在 Stackoverflow 上使用 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's answer using DateTime::Format::Duration 也这样做