java php js 转换字节单位
存储单位/文件大小 转如何和转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/article/39.html