对文件大小的格式化(有bytes输出KB,MB等等)-JS实现

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

原来同事也做过处理,不过是采用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;

不过我感觉这样写不是太好,太多ifelse,并且我现在是采用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,整天用着别人的框架框来框去,基本都不接触什么算法,现在居然连最基本的数学基础都忘光光了。悲哀啊!

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值