ナンチャッテ・プログラマーの下駄です。
プログラマーと言えば、思考は何でもオブジェクト指向です。
僕も毎日ジョギングをしながら、日々の行動をオブジェクト分解して、論理的な行動フローを導き出しながら、それを改善する妄想コードを思考しているのですが、
きっと、側で見ている人は、気持ちが悪いだろうと、自分でも感じています。
今回は、今制作しているファイルアップロードプログラムで、初期設定に上限ファイル容量を指定する仕様を設けているのですが、
この時に、「ファイル容量はバイト数を記載すればいいじゃない」と当初思っていたのに、
linuxサーバーのいろんなコンフィグ設定で「10M」のように、単位付きでわかりやすく簡易な数値で登録出来たほうが使いやすいに決まっているので、以前作った、容量のバイト数から、単位をつけて、簡易な見た目にエンコードする、単位コンバータの逆バージョンを作ってみました。
そうです、プログラムの鉄板である、encodeを作ったらdecodeは作らなければいけません。
以前記事:
ファイルサイズのバイト数をKBやMBに表示変更する簡単コード
ちなみに、今回はjavascriptバージョンのみになります。
プログラム
function restoreSize(string , kiro){
if(!string){return false;}
var kiro = kiro ? kiro : 1024;
var reg = RegExp("^([0-9\.]+?)([kmgt]{1}b*)$","i");
string.match(reg);
if(!RegExp.$1 || !RegExp.$2){return false;}
var num = Number(RegExp.$1);
var unit = RegExp.$2.charAt(0).toLowerCase();
var units = ["b" , "k" , "m" , "g" , "t"];
res = false;
if(units.indexOf(unit) !== -1){
unit_num = units.indexOf(unit);
calc_num = num * Math.pow(kiro , unit_num);
res = Math.round(calc_num);
}
return res;
};
実行
restoreSize("10.13M");
> 10622075
デフォルトは、MiB(1kbあたりの容量を1,024bで計算)で行っていますが、MB(1kbあたりの容量を1,000bで計算)する場合は以下のようにオプションをつけます。
restoreSize("10.13M" , 1000);
> 10130000
解説
関数の受け取りは、"string"とオプションである"kiro"の値のみです。
var kiro = kiro ? kiro : 1024;
まず、kiro値をKiBにするか、kb(任意)にするかを判別しています。
三項演算子がわからない人は、下記のページを参考にしてください。
[Javascript] 三項演算子より短く変数代入する方法
var reg = RegExp("^([0-9\.]+?)([kmgt]{1}b*)$","i");
string.match(reg);
if(!RegExp.$1 || !RegExp.$2){return false;}
var num = Number(RegExp.$1);
次に、正規表現を使って、数値部分と単位部分を分解しています。
この条件にマッチしない場合は、falseを返して関数を終了しています。
var unit = RegExp.$2.charAt(0).toLowerCase();
この部分では、正規表現で抜き出した単位部分を1文字分の記号に変換しています。
基本的に、"K,KB","M,MB","G,GB","T,TB"のどれか(大文字小文字は問わず)を使うことを前提としているので、"MiB"と書いたらfalseが返ってしまいます。
var units = ["b" , "k" , "m" , "g" , "t"];
1文字単位を取り出す意味としては、上記の単位一覧のどれかに該当するかをチェックするためです。
peta-biteなどを追加したい場合は、配列の最後に"p"を追加してください。
ちなみに、この配列の順番にもポイントがあり、配列の順番値のべき乗値が返す数値に自動計算されるようにしているので、順番入れ替えをしないようにしましょう。
if(units.indexOf(unit) !== -1){
unit_num = units.indexOf(unit);
calc_num = num * Math.pow(kiro , unit_num);
res = Math.round(calc_num);
}
最後にこの箇所で、登録されている単位かどうかのチェックと、その値に変換するように計算しています。
ちなみに、今回はファイル容量を計算するための関数にしているので、マイナス値は対象にしていないのですが、もしマイナス値が必要な場合は、正規表現に"-"を追加して以下のようにする事で対応可能です。
var reg = RegExp("^([\-0-9\.]+?)([kmgt]{1}b*)$","i");
OSSの設定仕様も、使いやすさを考えておかなければ、後々に自分が苦労するだけですからね。
こうした関数を作っておくことも重要ではないでしょうか?
0 件のコメント:
コメントを投稿