首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将文件大小以字节为单位转换为人类可读的字符串

将文件大小以字节为单位转换为人类可读的字符串
EN

Stack Overflow用户
提问于 2012-05-03 03:27:09
回答 15查看 139.8K关注 0票数 295

我使用此函数将以字节为单位的文件大小转换为人类可读的文件大小:

代码语言:javascript
复制
function getReadableFileSizeString(fileSizeInBytes) {
    var i = -1;
    var byteUnits = [' kB', ' MB', ' GB', ' TB', 'PB', 'EB', 'ZB', 'YB'];
    do {
        fileSizeInBytes = fileSizeInBytes / 1024;
        i++;
    } while (fileSizeInBytes > 1024);

    return Math.max(fileSizeInBytes, 0.1).toFixed(1) + byteUnits[i];
};

然而,这似乎并不是100%准确的。例如:

代码语言:javascript
复制
getReadableFileSizeString(1551859712); // output is "1.4 GB"

这不应该是"1.5 GB"吗?看起来1024的除法正在失去精度。是我完全误解了什么吗,还是有更好的方法呢?

EN

回答 15

Stack Overflow用户

回答已采纳

发布于 2012-05-03 03:31:37

这取决于您想要使用二进制还是十进制约定。

例如,RAM总是以二进制度量,因此将1551859712表示为~1.4GiB将是正确的。

另一方面,硬盘制造商喜欢使用十进制,所以他们称之为~1.6 so。

令人困惑的是,软盘使用了两种系统的混合--它们的1MB实际上是1024000字节。

票数 56
EN

Stack Overflow用户

发布于 2013-02-17 16:57:09

下面是我写的一个:

代码语言:javascript
复制
/**
 * Format bytes as human-readable text.
 * 
 * @param bytes Number of bytes.
 * @param si True to use metric (SI) units, aka powers of 1000. False to use 
 *           binary (IEC), aka powers of 1024.
 * @param dp Number of decimal places to display.
 * 
 * @return Formatted string.
 */
function humanFileSize(bytes, si=false, dp=1) {
  const thresh = si ? 1000 : 1024;

  if (Math.abs(bytes) < thresh) {
    return bytes + ' B';
  }

  const units = si 
    ? ['kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'] 
    : ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'];
  let u = -1;
  const r = 10**dp;

  do {
    bytes /= thresh;
    ++u;
  } while (Math.round(Math.abs(bytes) * r) / r >= thresh && u < units.length - 1);


  return bytes.toFixed(dp) + ' ' + units[u];
}


console.log(humanFileSize(1551859712))  // 1.4 GiB
console.log(humanFileSize(5000, true))  // 5.0 kB
console.log(humanFileSize(5000, false))  // 4.9 KiB
console.log(humanFileSize(-10000000000000000000000000000))  // -8271.8 YiB
console.log(humanFileSize(999949, true))  // 999.9 kB
console.log(humanFileSize(999950, true))  // 1.0 MB
console.log(humanFileSize(999950, true, 2))  // 999.95 kB
console.log(humanFileSize(999500, true, 0))  // 1 MB

票数 448
EN

Stack Overflow用户

发布于 2013-12-23 01:32:10

计算的另一个实施例

代码语言:javascript
复制
function humanFileSize(size) {
    var i = Math.floor( Math.log(size) / Math.log(1024) );
    return ( size / Math.pow(1024, i) ).toFixed(2) * 1 + ' ' + ['B', 'kB', 'MB', 'GB', 'TB'][i];
};
票数 112
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10420352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档