次のように JavaScript でバイト単位で表されたファイル サイズを変換しようとしています (HTML 5)。
function formatBytes(bytes)
{
var sizes = ['Bytes', 'kB', 'MB', 'GB', 'TB'];
if (bytes == 0)
{
return 'n/a';
}
var i = parseInt(Math.log(bytes) / Math.log(1024));
return Math.round(bytes / Math.pow(1024, i), 2) + sizes[i];
}
しかし、必要に応じて、SI単位とバイナリ単位の両方でファイルサイズを表す必要があります。
kB<--->KiB
MB<--->MiB
GB<--->GiB
TB<--->TiB
EB<--->EiB
これは、次のように Java で実行できます (メソッドにブール値パラメーターを 1 つ追加して使用します)。
public static String formatBytes(long size, boolean si)
{
final int unitValue = si ? 1000 : 1024;
if (size < unitValue)
{
return size + " B";
}
int exp = (int) (Math.log(size) / Math.log(unitValue));
String initLetter = (si ? "kMGTPE" : "KMGTPE").charAt(exp-1) + (si ? "" : "i");
return String.format("%.1f %sB", size / Math.pow(unitValue, exp), initLetter);
}
JavaScript の同等のコードは次のようになります。
function formatBytes(size, si)
{
var unitValue = si ? 1000 : 1024;
if (size < unitValue)
{
return size + " B";
}
var exp = parseInt((Math.log(size) / Math.log(unitValue)));
var initLetter = (si ? "kMGTPE" : "KMGTPE").charAt(exp-1) + (si ? "" : "i");
alert(size / Math.pow(unitValue, exp)+initLetter);
//return String.format("%.1f %sB", size / Math.pow(unitValue, exp), initLetter);
}
前のスニペット (最後のスニペット) のコメント行が示すように、JavaScript で同等のステートメントを記述できませんでした。もちろん、JavaScript でこれを行う方法は他にもありますが、JavaScript/jQuery で同等のステートメントを記述できる場合は、簡潔でより正確な方法を探しています。出来ますか?