文件大小转换字节到 kb/mb/gb 函数不能按预期工作

Posted

技术标签:

【中文标题】文件大小转换字节到 kb/mb/gb 函数不能按预期工作【英文标题】:filesize conversion bytes to kb/mb/gb function does not work as expected 【发布时间】:2015-07-10 06:58:02 【问题描述】:

我有这个功能:

function formatSizeUnits($bytes,array $options = array())
        $forceFormat = isset($options["forceFormat"]) ? $options["forceFormat"] : false;
        $suffix = !isset($options["suffix"]) || $options["suffix"] === true ? true : false;
        switch($bytes):
            case $forceFormat === "gb":
            case $bytes >= 1073741824 && $forceFormat === false:
                $bytes = number_format($bytes / 1073741824, 2) . ($suffix === true ? " GB" : "");
                break;
            case $forceFormat === "mb":
            case $bytes >= 1048576 && $forceFormat === false:
                $bytes = number_format($bytes / 1048576, 2) . ($suffix === true ? " MB" : "");
                break;
            case $forceFormat === "kb":
            case $bytes >= 1024 && $forceFormat === false:
                $bytes = number_format($bytes / 1024, 2) . ($suffix === true ? " KB" : "");
                break;
            case $forceFormat === "b":
            case $bytes > 1 && $forceFormat === false:
                $bytes = $bytes . ($suffix === true ? " bytes" : "");
                break;
            case $bytes == 1 && $forceFormat === false:
                $bytes = $bytes . ($suffix === true ? " byte" : "");
                break;
            default:
                $bytes = "0".($suffix === true ? " bytes" : "");
        endswitch;
    return $bytes;
    

当我这样运行它时:

formatSizeUnits(0);

它返回这个: 0.00 GB

在这种情况下,$forceFormatfalse$suffixtrue

我不明白为什么它会返回 GB。我希望它只返回0 bytes

当我在第一个 switch 语句(gb 中的一个)中添加 var_dump 时,它会这样说:

case $forceFormat === "gb":
            case $bytes >= 1073741824 && $forceFormat === false:
                var_dump($bytes >= 1073741824, $forceFormat);

结果:

(bool(false)
bool(false)

我想知道为什么 $bytes >= 1073741824$forceFormat 都可能是假的,它仍然会运行这种情况。 我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

$bytes0 时,表达式$bytes >= 1073741824 && $forceFormat === false 的计算结果为falseswitch 语句跳转到表达式匹配$bytes 的第一个case。以下脚本演示了false 匹配0

<?php       
switch (0) 
  case false:
    echo '0 is false';
    break;
  case true:
    echo '0 is true';
    break;
  default:
    echo '0 is something else';
    break;

?>

因为你想跳转到第一个case,即true,你应该使用switch (true)

【讨论】:

啊,我明白了。是的.. 不幸的是,这听起来很合乎逻辑。没想到。有什么办法可以避免这种情况并将 0 视为一个数字? 正如我上面提到的,您只需将 switch ($bytes) 更改为 switch (true) 即可让您的代码正常工作。 啊,现在我明白了。所以实际上 switch 语句是没有用的。

以上是关于文件大小转换字节到 kb/mb/gb 函数不能按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

关于电脑的文件大小:kb、MB、GB的换算与关系?

PHP 用范围即字节,kb,mb,gb计算文件大小

bit,Byte,KB,MB,GB的转换关系

PHP 将 KB MB GB TB 等转换为字节

根据文件大小自动判断单位B,KB,MB,GB

python 智能转换字节为KB / MB / GB / TB / PB ...