一ヶ月ぶりのtです。
math.jsはJavaScriptの数学ライブラリで、単位変換、複素数、マトリクスなど、幅広い分野に対応するライブラリです。
今回は、単位変換に焦点を当てて説明し、バイト数を適切な単位で表示する方法について紹介します。
単位変換でどんなことができるのか
まず、速さに関する計算を例に、math.jsでどのようなことができるか紹介します。以下のコードを見てください。
1 2 3 4 5 6 7 8 9 |
const math = require( 'mathjs' ); // A. メートル毎秒からキロメートル毎時への単位変換 const speed = math.unit( 2, 'm/s' ); console.log( speed.to( 'km/h' ).toString() ); // 14.4 km / h // B. 2メートル毎秒で10分移動したときの距離 const time = math.unit( 10, 'mins' ); console.log( math.multiply( speed, time ).toString() ); // 2.4 km |
Aでは、メートル毎秒からキロメートル毎時への単位変換を行なっています。距離と時間を分けて考えるような単位変換も、直感的に計算できます。
Bでは、速さと時間を掛けることで距離を計算しています。単位を考えず直感的に計算できるだけでなく、結果の距離の単位も適切な単位に自動で変換してくれます。
バイト数を適切な単位で表示する
では本題である、バイト数に対して適切な単位を表示してみます。例えば、「5368709120(= 5×1024^3 )」であれば「5 GiB」のように、2進接頭辞(1024の冪)で適切な単位の表示を目指します。
以下のコードを見てください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
const math = require( 'mathjs' ); // 例として2つの数を用意 const size1 = 5 * Math.pow( 1024, 3 ); const size2 = 3 * Math.pow( 1024, 2 ) + 66566566; // A. formatメソッドで適切な単位に変換する(2進接頭辞にならない場合となる場合がある) console.log( math.unit( size1, 'B' ).format() ); // 5.36870912 GB console.log( math.unit( size2, 'B' ).format() ); // 66.48282432556152 MiB // B. 常に2進接頭辞で返すように考慮した関数 function byteFormat( byte ) { const x = math.unit( byte, 'B' ); const formatted = x.format(); const unit = formatted.substr( -2, 1 ); return unit === 'i' || unit === ' ' ? formatted : x.to( `${unit.toUpperCase()}iB` ).toString(); } console.log( byteFormat( size1 ) ); // 5 GiB console.log( byteFormat( size2 ) ); // 66.48282432556152 MiB |
Aでは、formatメソッドを用いて適切な単位への変換を行っています。ただし、単位としてB(バイト)を指定しても、2進接頭辞を必ず使うとは限りません。
そこで、Bでは、常に2進接頭辞で返すように考慮した関数を作成しました。formatメソッドを使って、一旦単位を求めた後に、2進接頭辞でなければ、強制的に2進接頭辞をつけて単位を変換する関数です。
このような関数を使うことにより、常に2進接頭辞を使った単位表示が可能です。
最後に
今回は、主に表示時に気を使う、単位周りについて紹介しました。math.jsは他にも、様々な機能がある数学ライブラリです。複雑な計算を迫られた時に、知っておくと便利なライブラリだと思います。機会があれば使ってみてください。
キー・ポイントでは、いろいろなライブラリを使いこなすエンジニアを募集しています。