ExtendScriptでは単位付き数値を扱うために、UnitValueオブジェクト(単位付き数値)というものが用意されています。これにより、単位を考慮した演算や比較が可能になります。

UnitValueオブジェクトは以下のように作成します。

//UnitValue (value, unit);
var uVal= new UnitValue (100, "mm"); //UnitValueオブジェクト作成
var uVal= new UnitValue ("10mm"); //このような文字列でもOK

参照:<付録> 利用できる単位系一覧

 

UnitValue化された数値を使うと、以下のようなことが可能になります。

 

ユーザーに単位付き文字列で数値を入力させ、何らかの計算後、それを単位付き文字列で返すことができます。

//UnitValueを使って単位付き文字列入力に対応する
var input= '10mm'; //例えばこんな入力があったとして...
var uVal= new UnitValue(input); //UnitValueオブジェクト作成
var res= (uVal/2).toString();
$.writeln (res); //'5 mm'

結果に単位が不要な場合は、以下のようにすればよいでしょう。

var uVal= new UnitValue('7mm'); //UnitValueオブジェクト作成
var res= parseFloat(uVal/2);
$.writeln (res); // 3.5

 

また、異なる単位へ換算することができます。

//UnitValueによる単位の変換
var uVal= new UnitValue(1, 'pt'); //UnitValueオブジェクト作成
if ( uVal.convert('mm') ) {
    var num= uVal.as('mm');
    alert ( num ); //0.3527...
} 

この例では、2行目のIF文で「単位換算が可能か否か」を評価していますが、変換できることが明らかな場合は省略しても構いません。

 

異なる単位同士の演算も可能です。特に「inch」と「point」の関係のように、十進法ではない単位系を演算するときに重宝します。なお、演算後の単位は先頭の単位に揃えられます。 

//UnitValueによる異なる単位同士の演算
var uVal_a= new UnitValue(1, 'in'); //inch
var uVal_b= new UnitValue(36, 'pt'); //point
var num= uVal_a+uVal_b; //違う単位同士の演算
alert ( num ); //1.5in
num= uVal_b+uVal_a; //演算の順番を変更
alert ( num ); //108pt

 

異なる単位同士の値を比較することも可能です。

//UnitValueによる異なる単位同士の評価(IF文)
var uVal_a= new UnitValue(1, 'in'); //inch
var uVal_b= new UnitValue(71, 'pt'); //point
if (uVal_a > uVal_b) {
    alert ( uVal_a ); // 1inが大きい
} else {
    alert ( uVal_b );
}
uVal_a= UnitValue(1, 'in'); //inch
uVal_b= UnitValue(73, 'pt'); //point
if (uVal_a > uVal_b) {
    alert ( uVal_a );
} else {
    alert ( uVal_b ); // 73ptが大きい
}

 

<相対的な値変換を行う>

mmからpixelに単位変更したい場合、その根拠となる解像度が必要になります。こういった計算を行うときは、対象とするUnitValueオブジェクトのbaseUnitプロパティに基準となる値を設定します。 なお、baseUnitプロパティを設定しても相対的な計算以外に影響はありません。

//baseUnitを設定して相対的な値を扱う
var uVal_mm= UnitValue(100, 'mm');
uVal_mm.baseUnit= UnitValue (1/350, 'in'); //350ppi
var px= uVal_mm.as ('px'); //100mmをpixelで取得
$.writeln (px); //1377.95275590551
$.writeln (uVal_mm+1); //101mm(相対的な計算以外に影響はない)

 

<注意点>

基本的に四則演算であればどのようなものでも可能ですが、カッコ付きの式では注意が必要です。以下にその例を示します。

var AA= new UnitValue('1cm');
var BB= new UnitValue('5mm');
var CC= new UnitValue('4mm');
var DD= new UnitValue('3mm');
$.writeln ( AA + (BB+CC) / DD ); //re. 4 cm <間違い
$.writeln ( (BB+CC) / DD ); //re. 3 <OK(単位が消えていることに注目)
$.writeln ( (BB+CC) ); //re. 9 mm <OK
$.writeln ( AA + (BB+CC) ); //re. 1.9 cm <OK

最初の式「AA + (BB+CC) / DD」の答えが違っています。

その理由は2行目を見るとわかります。後半部分だけにしてみると単位が消えています。これは表示が消えているだけではなく、UnitValueオブジェクトでなくなっています。 

つまり、先に優先部分を計算したところで単位が消え、次いで頭の単位に合わせて数値を合算(仕様)した結果、「4 cm」ということになってしまったのです。

しかし、カッコ付き計算式がダメなわけではなく、3行目の式では正しい答えを返してきます。そして、それが単位付きで返ってくれば4行目のような式も正しく計算されます。

※この辺りの仕様について詳しい方がいらっしゃったら、ぜひ教えて下さい。

 

 

Joomla templates by a4joomla