我得到这段代码通过PHP隐蔽大小字节。
现在我想使用JavaScript将这些大小转换为人类可读的大小。我尝试将这段代码转换为JavaScript,看起来像这样:
function formatSizeUnits(bytes){
if (bytes >= 1073741824) { bytes = (bytes / 1073741824).toFixed(2) + " GB"; }
else if (bytes >= 1048576) { bytes = (bytes / 1048576).toFixed(2) + " MB"; }
else if (bytes >= 1024) { bytes = (bytes / 1024).toFixed(2) + " KB"; }
else if (bytes > 1) { bytes = bytes + " bytes"; }
else if (bytes == 1) { bytes = bytes + " byte"; }
else { bytes = "0 bytes"; }
return bytes;
}
这是正确的做法吗?有没有更简单的方法?
这是目前排名最高的答案的后续。
边界情况
我发现了一个边缘情况:非常少量的字节!具体来说,当字节数在-1和1之间(独占)时。
例如,考虑0.25字节。在这种情况下,Math.floor(Math.log(0.25) / Math.log(1024))将返回-1。由于-1不是一个有效的索引,formatBytes(0.25)将返回类似“0.25 undefined”的值。
下面是一个使用Wolfram Alpha的边缘情况的示例。
Fix
我通过添加Math来解决这个问题。马克斯(0,…):
数学。max(0, Math.floor(Math.log(bytes) / Math.log(1024))
数学。Max(0,…)确保索引值始终至少为0。
这是目前排名最高的答案的后续。
边界情况
我发现了一个边缘情况:非常少量的字节!具体来说,当字节数在-1和1之间(独占)时。
例如,考虑0.25字节。在这种情况下,Math.floor(Math.log(0.25) / Math.log(1024))将返回-1。由于-1不是一个有效的索引,formatBytes(0.25)将返回类似“0.25 undefined”的值。
下面是一个使用Wolfram Alpha的边缘情况的示例。
Fix
我通过添加Math来解决这个问题。马克斯(0,…):
数学。max(0, Math.floor(Math.log(bytes) / Math.log(1024))
数学。Max(0,…)确保索引值始终至少为0。
const byteConversion = (bytes: number, decimals = 2) => {
if (bytes === 0) return '0 B';
const kiloByte = 1000;
const decimal = decimals < 0 ? 0 : decimals;
const sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
const i: number = Math.floor(Math.log(bytes) / Math.log(kiloByte));
return `${parseFloat((bytes / kiloByte ** i).toFixed(decimal))} ${sizes[i]}`;
};
我使用递归和分配水平变量为适当的单位。
函数getReadableByte(count, decimal=0, level=0) {
让unitList =[“字节”,“知识库”,“m”,“g”、“肺结核”,“PT”);
if (count >= 1024.0 && (level+1 < unitList.length)) {
返回getReadableByte(count/1024, decimal, ++level)
}
返回' ${小数?(count).toFixed(decimal): Math.round(count)}${unitList[level]} '
}
2) console.log (getReadableByte (120)