【Javascript】バイト変換

```js:Javascript
var size=9870931;
var size2=9870931000;
document.writeln("size:"+size+"<br/>\n");//size:9870931
document.writeln("size:"+DownloadSize(size)+"<br/>\n");//size:9.41(MB)

document.writeln("size2:"+size2+"<br/>\n");//size2:9870931000
document.writeln("size2:"+DownloadSize(size2)+"<br/>\n");//size2:9.19(GB)

function DownloadSize(size) {

	var sizes =['(B)', '(KB)', '(MB)', '(GB)', '(TB)', '(PB)', '(EB)'];
	var ext = sizes[0];

	if(typeof size==='number'){
     	for (var i=1;i< sizes.length;i+=1){
			if(size>= 1024){
        		size = size / 1024;
	        	ext = sizes[i];
           	}
     	}
  	}

  return round(size, 2)+ext;
}

function round (value, precision, mode) {
  // http://kevin.vanzonneveld.net
  // +   original by: Philip Peterson
  // +    revised by: Onno Marsman
  // +      input by: Greenseed
  // +    revised by: T.Wild
  // +      input by: meo
  // +      input by: William
  // +   bugfixed by: Brett Zamir (http://brett-zamir.me)
  // +      input by: Josep Sanz (http://www.ws3.es/)
  // +    revised by: Rafa? Kukawski (http://blog.kukawski.pl/)
  // %        note 1: Great work. Ideas for improvement:
  // %        note 1:  - code more compliant with developer guidelines
  // %        note 1:  - for implementing PHP constant arguments look at
  // %        note 1:  the pathinfo() function, it offers the greatest
  // %        note 1:  flexibility & compatibility possible
  // *     example 1: round(1241757, -3);
  // *     returns 1: 1242000
  // *     example 2: round(3.6);
  // *     returns 2: 4
  // *     example 3: round(2.835, 2);
  // *     returns 3: 2.84
  // *     example 4: round(1.1749999999999, 2);
  // *     returns 4: 1.17
  // *     example 5: round(58551.799999999996, 2);
  // *     returns 5: 58551.8
  var m, f, isHalf, sgn; // helper variables
  precision |= 0; // making sure precision is integer
  m = Math.pow(10, precision);
  value *= m;
  sgn = (value > 0) | -(value < 0); // sign of the number
  isHalf = value % 1 === 0.5 * sgn;
  f = Math.floor(value);

  if (isHalf) {
    switch (mode) {
    case 'PHP_ROUND_HALF_DOWN':
      value = f + (sgn < 0); // rounds .5 toward zero
      break;
    case 'PHP_ROUND_HALF_EVEN':
      value = f + (f % 2 * sgn); // rouds .5 towards the next even integer
      break;
    case 'PHP_ROUND_HALF_ODD':
      value = f + !(f % 2); // rounds .5 towards the next odd integer
      break;
    default:
      value = f + (sgn > 0); // rounds .5 away from zero
    }
  }

  return (isHalf ? value : Math.round(value)) / m;
}

```

##解説
jQueryのajaxメソッドを使い、phpのfilesize関数で取得したファイルサイズを、
DownloadSize関数に放り込むとB、KB、MB、GB、TB、PB、EBへ変換する。

##この記事の筆者、京四郎の現状
phpjsのfilesize関数を使用すれば、phpのfilesize関数で取得した値をajaxメソッドで持ってきて、
なんてせずにファイルサイズが求められそうだが、phpjsのfilesize関数が「すべてのブラウザでも動作するか？」とか
把握してないから現状は使用していない。
参考にしたwebサイトではphp用のDownloadSize関数であるが、Javascript用のDownloadSize関数に作りなおしたのは、私が制作するAjaxアプリケーションでは、phpのfilesize関数で取得した値に対してJavascriptでいろいろ計算したあとに、バイト変換するためである。
phpのfilesize関数で取得した値に対する計算などは、phpでやる必要がなく、Javascript側でやるようにしている。
クライアント側で可能なことはJavascriptでやるようにして、サーバー側のphpでやる処理を減らす方針でやっている。


##参考文献
ファイル情報の表示
http://sozaifan.exblog.jp/839291/

JavaScript round function
http://phpjs.org/functions/round/

JavaScript filesize function
http://phpjs.org/functions/filesize/