页面有输出附件大小,由于数据库里存在都是字节大小,所以在展示的时候都要进行格式化一下。

原来同事也做过处理,不过是采用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,整天用着别人的框架框来框去,基本都不接触什么算法,现在居然连最基本的数学基础都忘光光了。悲哀啊!