问题描述
|
我有一个实用程序功能,可以像Windows资源管理器一样以适当的形式显示文件大小,即将其转换为最接近的KB,MB,GB等。我想知道我编写的代码是否正确,以及是否可以使其更简单。
我写的功能如下:
public static function formatFileSize(bytes:int):String
{
if(bytes < 1024)
return bytes + \" bytes\";
else
{
bytes /= 1024;
if(bytes < 1024)
return bytes + \" Kb\";
else
{
bytes /= 1024;
if(bytes < 1024)
return bytes + \" Mb\";
else
{
bytes /= 1024;
if(bytes < 1024)
return bytes + \" Gb\";
}
}
}
return String(bytes);
}
尽管目前它为我完成了工作,但我认为它可以以更简单的方式编写,甚至可以进行优化。
提前致谢
解决方法
这是一种更简单的方法:
private var _levels:Array = [\'bytes\',\'Kb\',\'MB\',\'GB\',\'TB\',\'PB\',\'EB\',\'ZB\',\'YB\'];
private function bytesToString(bytes:Number):String
{
var index:uint = Math.floor(Math.log(bytes)/Math.log(1024));
return (bytes/Math.pow(1024,index)).toFixed(2) + this._levels[index];
}
为了完整起见,我将其添加到了yottabytes :)
,@J_A_X是执行此操作的最佳方法,但是对于将来,我建议您在发现像嵌套嵌套if...else...if
语句时尽早返回。
public static function formatFileSize(bytes:int):String
{
if(bytes < 1024)
return bytes + \" bytes\";
bytes /= 1024;
if(bytes < 1024)
return bytes + \" Kb\";
bytes /= 1024;
if(bytes < 1024)
return bytes + \" Mb\";
bytes /= 1024;
if(bytes < 1024)
return bytes + \" Gb\";
return String(bytes);
}