java php js 转换字节单位

—— 存储单位、文件大小转B KB MB GB TB
标签: 函数
2017-12-22 阅读(221)

存储单位/文件大小 转如何和转B KB MB GB TB

bit是最小的存储单位,1字节为8位二进制数。

1Byte = 8bit,被称一个存储元。


以下为换的公式

1KB = 1024B

1MB = 1024KB

1GB = 1024MB

1TB = 1024GB


应用场景在哪里

开发人员需要把文件大小和存储空间显示给用户看等的时候,

常常把存储占用空间的长度long字节,换算为更好看和容易识别的或者说是用户体验更好表示方法。


那么怎么去转换呢

假设长度:5242880字节

多少KB = 5242880/1024

多少MB = 5242880/1024/1024

.....

以此类推


那代码很显然

if(5242880 < 1024)

    return B

else if(5242880 < 1024 * 1024)

    return KB

....


再配合简单四射五入 System.format("%.2f", x) 就完美了。


按照这种思路得

public static String formatBytes(long size) {
    if(size==0)
        return "0B";
    long kb = 1024;
    long mb = kb * kb;
    long gb = mb * kb;
    long tb = gb * kb;
    if(size < kb) {
        return String.format("%d B", size);
    }else if(size < mb){
        float f = (float) size / kb;
        return String.format("%.2f KB", f);
    }else if(size < gb){
        float f = (float) size / mb;
        return String.format("%.2f MB", f);
    }else if(size < tb){
        float f = (float) size / gb;
        return String.format("%.2f GB", f);
    }else{
        float f = (float) size / tb;
        return String.format("%.2f TB", f);
    }
}

试下先

System.out.println(formatBytes(22132233342221322L))
//输出:20129.15 TB

可以使用了。


这样太臃肿了,重复也多

能有更为简洁的转换B KB MB GB TB办法吗?

方法总是有的,只要你想的到。


不知道是哪位大神想出来的,前人种树后人乘凉。

前人的办法是定义各个单位的数组,然后取绝对值(因为用可能需要用到负值)。

很巧妙地,一直for循环长度除以1024,直到合长度小于1024临界 或 循环次数大于等于单位长度-1 停止。

这样得到了 最大单位的数值 和 单位数组位置下标 i。

当然可能不是最好办法,但足够用了。


记得还有人用了 Math.log() 和 Math.pow() 的办法也很棒,数学大神,

但是办法归办法,万变不离其中,有时候原始的东西也很美妙,直观不会出错。


按照这种思路翻译了各个版本代码:

JAVA版文件大小转B KB MB GB TB

public static String formatBytes(long size){
    char[] units = {'B','K','M','G','T'};
    float resize = Math.abs(size);
    int i = 0;
    for(; resize >= 1024 && i < 4;i++)
        resize /= 1024;
    return ((resize<0)?"-":"") + String.format("%.2f"+units[i], resize);
}


PHP版文件大小转B KB MB GB TB

function formatBytes($size) {
    $units = array('B','K','M','G','T');
    $size = abs($size);
    for($i = 0; $size >= 1024 && $i < 4; $i++)
        $size /= 1024;
    return (($size<0)?'-':'') . round($size, 2) . $units[$i];
}


JS版文件大小转B KB MB GB TB

function formatBytes(size){
    var units = ['B','K','M','G','T'];
    size = Math.abs(size);
    var i = 0;
    for(;size >= 1024 && i < 4; i++)
        size /= 1024;
    return ((size<0)?'-':'') + size.toFixed(2) + units[i];
}


打完收工,不对请指出哈。

原创文章,转载请注明出处:https://www.weizhixi.com/user/index/article/id/39.html

分类:
点击(271) 阅读(221) 举报