FileMaker 計算式の小ネタです。生のファイルサイズ(BYTE)を桁に合わせて見栄え変換します。
ファイルサイズのフォーマット
いろんな目的や手段によってファイルサイズを取得することがあると思いますが、取得した生のデータは最小バイト単位の数字で、桁数が多いです。運用上はそのままであることが望ましいですが、表示上、桁数に合わせて KB とか MB とか GB の単位を付けて見栄えを整えたいこともあります。
JavaScript で 1024B単位でのフォーマット
javascript では次のようなスクリプトになろうかと思います。
// javascript のスクリプト // bytes に生の数値 function formatFileSize(bytes) { if (bytes < 1024) { return bytes + ' B'; } else if (bytes < 1024 * 1024) { return (bytes / 1024).toFixed(2) + ' KB'; } else if (bytes < 1024 * 1024 * 1024) { return (bytes / (1024 * 1024)).toFixed(2) + ' MB'; } else { return (bytes / (1024 * 1024 * 1024)).toFixed(2) + ' GB'; } }
優等生的なスクリプトかな。1024B単位で計算し、小数点2桁で整えています。
Javascript でファイル情報を取得するときなんかにファイルサイズをこのスクリプトでフォーマットしてしまうと生のデータが失われるのでそういう使い方は好ましくありません。UNIXコマンドで取得する場合もそうですが、整形せず生の数字を取得します。そうでないと後々ソートや比較が面倒になります。
FileMaker の計算式
FileMaker で同じような計算式を作りましょう。カスタム関数に保存して使い回すと便利です。
上記 javascript と同じならこうなりますか。
// FileMaker 計算式 // $Bytes に生の数値 Let ( [ bytes = GetAsNumber ( $Bytes ); formatSize = Case ( bytes < 1024 ; bytes & "B" ; bytes < 1024 * 1024 ; Round ( bytes / 1024 ; 2 ) & "KB" ; bytes < 1024 * 1024 * 1024 ; Round ( bytes / (1024 * 1024 ) ; 2 ) & "MB" ; Round ( bytes / 1024 * 1024 * 1024 ) ; 2 ) & "GB" ) ]; formatSize )
これでもいいんですが、ここからちょっとこだわりの計算式に変更してみましょう。
Finder に準拠したファイルサイズのフォーマット
上記の計算は 1024バイトを軸していますが、多くの事例で 1000 で計算されることが確認されております。正確には 1024 が正しいのかもしれませんが、1000 でOKっていうことですか。よくわかりませんが、Mac の Finder もそうなっています。
1000バイト単位
Finder で表示されるファイルサイズのフォーマットは、例えば以下のようになっていますね。
コマンドやスクリプトで整形済みのファイルサイズを取得した場合、Finderと結果が異なるので最初は混乱しました。
例えば 13469419バイト のデータは、Finder では 13.5MB と表示され、一般的なコマンドのフォーマット済みで取得すると 12.85MB と表示されます。
Finder は 1000 単位でフォーマットしており、一般的なスクリプトやコマンドでは 1024 で計算するのだから見た目は当然ズレます。
バイト数は変わらないので問題ないといえばないのですが、せっかくのFileMaker なので、Finder の表記に合わせてみたいと思います。
小数点以降のこだわり
Finder を改めて見ますと、小数点以降の表記に少し美しさがあります。これはどういうことでしょう。
なるほどそういうことですか。
KB のときは小数点以降なし、MB のときは小数点以降1桁、GB のときは小数点以降を2桁にしてみましょう。
Let ( [ bytes = GetAsNumber ( $Bytes ); formatSize = Case ( bytes < 1000 ; bytes & "B" ; bytes < 1000 * 1000 ; Round ( bytes / 1000 ; 0 ) & "KB" ; bytes < 1024 * 1000 * 1000 ; Round ( bytes / (1000 * 1000 ) ; 1 ) & "MB" ; Round ( bytes / (1000 * 1000 * 1000 ) ; 2 ) & "GB" ) ]; formatSize )
これで多分 Finder と同じフォーマットで出力されます。
まあMacのFinderを真似る必要もないんですが、単位ごとに小数点以降の表記を変えることに少し美しさを感じたのでやってみました。
各自、お好きなように工夫されてはいかがでしょう。
桁に合わせたフォーマット変換、ずいぶん昔に作った強引で不細工な計算式のままカスタム関数として使い回してきました。これを機会にこっちを使うようにしようっと。