页面有输出附件大小,由于数据库里存在都是字节大小,所以在展示的时候都要进行格式化一下。
原来同事也做过处理,不过是采用java代码:
String filename = "";
float size=0f;
String unit="";//单位
float attchSize = Float.parseFloat(filesize);
if(attchSize<1024){
size = (float)(attchSize);
unit=" 字节";
}else{
float k = (float)(attchSize/1024);
if(k<1024){
size = (float)(k);
unit = " KB";
}else{
float m = (float)(k/1024);
if(m<1024){
size = (float)(m);
unit = " MB";
}else{
size = (float)(m/1024);
unit =" GB";
}
}
}
DecimalFormat formater=new DecimalFormat("#0.##");
filename =formater.format(size).toString();
if((filename .indexOf(".00"))!=-1){
filename =filename .substring(0,filename .indexOf(".00"));
}
filename +=unit;
不过我感觉这样写不是太好,太多if,else,并且我现在是采用Ext来做前台框架,希望通过renderer来进行格式化处理。
网上找到一个php版本的,代码如下:
<? php
function setupSize( $fileSize ) {
$size = sprintf ( " %u " , $fileSize );
$sizename = array ( " Bytes " , " KB " , " MB " , " GB " , " TB " , " PB " , " EB " , " ZB " , " YB " );
return round ( $size / pow ( 1024 , ( $i = floor ( log ( $size , 1024 )))) , 3 ) . $sizename [ $i ];
}
echo setupSize( ' 200000 ' )
?>
没接触过php,不过大概根据它代码的意思用js写出代码如下:
/*附件大小格式处理*/
function renderSize(value, p, record){
var unitArr = new Array("Bytes","KB","MB","GB","TB","PB","EB","ZB","YB");
var index;
var srcsize = parseFloat(value);
var size =Math.round(srcsize/Math.pow(1024,(index=Math.floor(这里求log对数如何转换))),3);
return size+unitArr[index];
}
我采用Math.log(srcsize ,1024)运行根本就找不到这个方法,查看API才知道,原来js里根本就没这个方法,它只有一个Math.log(x)是固定以e为底数的。
最后发帖求助,才知原来可以通过任意底的对数
function lg(x,n){
return log(x)/log(n)
}
即:Math.log(x)/Math.log(1024)。在此非常感谢lihanbing在发帖后不久就给我解答。
最后修改代码如下:
/*
四舍五入保留小数位数
numberRound 被处理的数
roundDigit 保留几位小数位
*/
function roundFun(numberRound,roundDigit) //处理金额 -by hailang
{
if(numberRound>=0) {
var tempNumber = parseInt((numberRound * Math.pow(10,roundDigit)+0.5))/Math.pow(10,roundDigit);
return tempNumber;
}else{
numberRound1=-numberRound
var tempNumber = parseInt((numberRound1 * Math.pow(10,roundDigit)+0.5))/Math.pow(10,roundDigit);
return -tempNumber;
}
}
/*附件大小格式处理*/
function renderSize(value, p, record){
if(null==value||value==''){
return "0 Bytes";
}
var unitArr = new Array("Bytes","KB","MB","GB","TB","PB","EB","ZB","YB");
var index=0;
var srcsize = parseFloat(value);
var size =roundFun(srcsize/Math.pow(1024,(index=Math.floor(Math.log(srcsize)/Math.log(1024)))),2);
return size+unitArr[index];
}
由于Math.round()是四舍五入截取整数,可我希望能保留两位小数,所以网上找到function roundFun(numberRound,roundDigit) 这个方法。
在lihanbing未答复之前,我又采用了另外一种笨拙的解决方法:
/*附件大小格式处理*/
function renderSize(value, p, record){
if(null==value||value==''){
return "0 Bytes";
}
var unitArr = new Array("Bytes","KB","MB","GB","TB","PB","EB","ZB","YB");
var index=0;
var srcsize = parseFloat(value);
var quotient = srcsize;
while(quotient>1024){
index +=1;
quotient=quotient/1024;
}
return roundFun(quotient,2)+" "+unitArr[index];
}
不得不感叹,出来做了一年多java,整天用着别人的框架框来框去,基本都不接触什么算法,现在居然连最基本的数学基础都忘光光了。悲哀啊!