Rigid Chips リファレンスマニュアル モデルデータ SCRIPT考察5


目次へ戻る

■SCRIPT考察5「数値の表示フォーマットを変えたい」


◆考え方

Rigid Chipsではスクリプトを用いて画面上に様々な情報を文字で表記することが可能ですが、数値情報については小数点以下2桁を表示するよう自動的にフォーマット制御が行われます。
表示する数値が整数であることが分かっているときに、小数点以下の表示が無駄と感じることもあるかと思います。
また逆に、小数点以下3桁以下の部分も表示したいと思うことがあるかもしれません。
ここでは、LUAを用いて様々な数値の表示の仕方(フォーマット制御)について説明します。


◆実装


Val{
	val(default=0,min=-20,max=20,step=0,disp=1)
}
///////////////////////////////////////////////////////////////////////////////
Key{
}
///////////////////////////////////////////////////////////////////////////////
Body{
	core(){}
}
///////////////////////////////////////////////////////////////////////////////
Lua{
function main()
	VAL=VAL+0.1
	if(VAL>20) then VAL=-20 end
	out( 0,"&Val = ",VAL)
	out( 1,"&Val = "..VAL)
	out( 2,"&Val = "..math.floor(VAL+0.5))
	out( 3,string.format("&Val = %d",VAL))
	out( 4,string.format("&Val = %4d",VAL))
	out( 5,string.format("&Val = %04d",VAL))
	out( 6,string.format("&Val = %+04d",VAL))
	out( 7,string.format("&Val = %f",VAL))
	out( 8,string.format("&Val = %8.3f",VAL))
	out( 9,string.format("&Val = %08.3f",VAL))
	out(10,string.format("&Val = %+08.3f",VAL))
	out(11,string.format("&Val = %xh",VAL))
	out(12,string.format("&Val = %08Xh",VAL))
	out(13,string.format("&Val = %d, %f, %xh, %Xh",VAL,VAL,VAL,VAL))
	out(14,string.format("&Val = %%, %%d, %%f, %%xh, %%Xh"))
	out(15,string.format("%d",VAL))
end
}
【実行画面】


表示対象となる数値(変数)は「VAL」とし、これは0.1刻みで-20〜20を巡回しています。
まず0行目を見てください。
ここでは、単純にVALを表示しているだけなので、小数点以下2桁が表示されます。

次に1行目を見てください。
0行目と比べて「Val = 」と「VAL」の2つの表示情報の間が「,」から「..」に変わっただけですが、実際の表示は異なってきます。
「,」は単純に左右の表示情報を並べて表示するという意味なので、「Val = 」という文字列と「VAL」という数値を並べて表示しているだけです。
一方「..」は文字列連結の演算子なので、「Val =」と「VAL」を結合して一つの「Val = ##.##・・・」という文字列にし、この文字列を表示するという制御になっています。
RCの数値フォーマットの自動制御は数値のみが対象なので、このように文字列として表示すると数値の生データをそのまま表示することができるようになります。

実際の表示内容を確認すると、VALの小数点以下第2位以下は0のはずなのに、0以外の数値が入っています。
これは数値を取り扱う上でのRC内部誤差なので、基本的に回避不能です。
例えばVALの整数部のみを表示したい場合は2行目のようにする方法があります。

2行目では、まずVALに0.5を加算し、その後math.floor関数を使って小数部を切り捨ててから、文字列結合させています。
こうすることで、VALの小数点以下第1位を四捨五入した整数が表示されるようになります。

3行目以降では、LUAの組み込み済み関数「string.format」を用いた数値のフォーマット整形を行っています。

・string.format("フォーマット定義",引数1,引数2,・・・)、戻り値:フォーマット整形された文字列

フォーマット定義の中では、実際に表示したい文字列を書き込みます。
文字列の中に変数を埋め込みたい場合は、埋め込みたい位置に、表示形式を指定する記号(オペレータ)を書き込みます。
記号は「%」に続けて特定の英数字・記号を書きます。
各記号の意味は以下のようになっています。

【形式】:%[記号1][記号2][記号3]
・%:数値フォーマット指定オペレータの開始記号で、省略できません。
・記号1:「+」と書くと、正数の場合に+符号が付くようになります。省略可。
・記号2:表示するときの桁数を10進数で指定します。省略可。
           桁数には+/-の符号、小数点も含まれます。例えば「-12.3」は5桁として扱われます。
           桁数指定の数字の先頭に「0」を付けると、表示対象数値の桁が不足した部分に「0」が埋め込まれるようになります。
           「5.2」のように、小数点で区切って2つの数字を書くと、左側が全体の桁数、右側が小数点以下の桁数を表すようになります。
・記号3:数値の型を指定します。省略不可。
           d:整数表記
           f:実数表記
           x:16進数表記(a〜fは小文字)
           X:16進数表記(A〜Fは大文字)

具体的にどのような指定をすると、どのように表示されるかは、実際の表示内容を参照してください。

なお、「%」は上記のとおり特別な記号として扱われるため、通常は「%」をそのまま表示することができません。
「%」をそのまま表示したい場合は、「%%」といった具合に2つ重ねることで「%」という文字として解釈されるようになります。(14行目参照)

また、いくらstring.formatを使ってフォーマット整形を行っても、結果として得られた文字列が全体として数値と見なせる場合、RCの自動フォーマット制御によって、小数点以下2桁が表示されるようになってしまいます。(15行目参照)
思い通りのフォーマット制御をする場合は、何らかの数値以外の文字列を含めるようにして下さい。

目次へ戻る