テキスト(数値)のフォーマット – FlyWithLua

2023年4月8日

テキストの表示形式を設定。
以下の画像は下のスクリプトの9行目〜14行目までの状態を表示している。

  • 以下「string.format(“%8d”, i)」は8桁での右寄せ表示。
  • 8桁表示で桁数が少ない数値の場合、その分右にテキストが移動し数字の前は空白になる。
  • 小数点以下の桁数設定(14行目)もできる。「%7.3f」は全体の桁数が7桁(小数点も含む)で小数点以下が3桁を表示する場合になるこのfに入れる場合は必ず整数でなく不動小数点を入れること。

以下のスクリプトは一番上の画像の通りになる。10行目の例で、前3つの%dと後の3つtext_1とそれぞれ順番に対応していることになる。

----------------------------------------------------
wnd = float_wnd_create(400, 200, 1, true)
float_wnd_set_title(wnd, "Buttons")            
float_wnd_set_imgui_builder(wnd, "im_on_build") 
----------------------------------------------------
local text_1=123
local text_2=123.45
function im_on_build(wnd, x, y)
    imgui.TextUnformatted(text_1)  --基本的な使い方
    imgui.TextUnformatted(string.format("%d %d %d",text_1 ,text_1 ,text_1))	--値を複数表示
    imgui.TextUnformatted(string.format("%05d",text_1))	    --5桁表示し左を0で埋める
    imgui.TextUnformatted(string.format("%-8d",text_1))	    --8桁表示し左寄せ
    imgui.TextUnformatted(string.format("%8d",text_1))	    --8桁表示し右寄せ(数字以外は桁数分空き)
    imgui.TextUnformatted(string.format("%7.3f",text_2))    --7桁で小数点以下3桁表示
end

format … 文字列型

%d整数の10進法として出力
%u符号なし整数の10進法として出力
%o整数の8進法として出力
%x整数の16進法として出力
%f小数点表示
%c1文字出力
%%%を出力
s = string.format("%d, %x", 10, 10)                    -- s="10, a"
s = string.format("%dab%d", 10, 20)                    -- s="10ab20"
s = string.format("[%4d], [%-4d], [%04d]", 10, 10, 10) -- s="[  10], [10  ], [0010]"

%sもある

ウインドウのサイズ数値の取得

--1番目のウインドウの作成
ihd_wnd = float_wnd_create(200, 100, 1, true)
float_wnd_set_position(ihd_wnd, 100, 100)
float_wnd_set_title(ihd_wnd, "Imgui Hello World")
float_wnd_set_imgui_builder(ihd_wnd, "ihd_on_build")
float_wnd_set_onclose(ihd_wnd, "closed_hello_world")

function ihd_on_build(ihd_wnd, x, y)
	--Hello World:のテキスト表示、改行してwndの情報とxyの情報を表示
    imgui.TextUnformatted(string.format("Hello World:\n  wnd=%s\n  x=%d\n  y=%d", ihd_wnd, x, y))
end


function closed_hello_world(wnd)
    local _ = wnd -- Reference to window, which triggered the call.
	-- この関数は、ユーザーがウィンドウを閉じると呼び出されます。 imguiの描画または呼び出し
	-- ウィンドウは既に破棄されているため、この関数では関数を使用できません。
end

以下は小数点以下、下2桁表示(0.00)と表示する場合、2を1にすれば1桁表示になる。

imgui.TextUnformatted(string.format(“%.2f”, airspeed_kts))

整数のdataref値を取得して不動小数点に変換する

X-Planeではdatarefの値をそのまま使ってもダメな場合がある。周波数等は小数点の無い整数で表示され扱われているので不動小数点にする必要がでてくる。
そんなときは「string.format」を使って、これで変換して使うことになる。
%f=不動小数点、%d=整数
整数でも、%fを使用すると「0.000000」と表示される。
逆に不動小数点の場合、%dを使用すると「1」と表示される。
結局、数値の表示そのものはどちらでも使用できる。

整数を扱う場合

以下のようにdataarefでは1と0の整数で設定されている。

こういう場合は%dを使う。これを使わず、普通に変数で入れても同じ結果になるはずである。これはあくまで例題としてのスクリプトになる。

dataref("FD_Switch", "sim/cockpit2/autopilot/flight_director_mode")
function show_ALT_parameters()
	-- %f=不動小数点、%d=整数、
	local info_to_print = string.format("FD_Switch = %d", FD_Switch)
	draw_string_Helvetica_18(200, 300, info_to_print)
end

do_every_draw("show_ALT_parameters()")

整数の周波数を不動少数点にする場合

以下のようにdataref値では5桁の整数12620になっている。しかし実際には右の7セグ表示では不動小数点126.200になっている。

こいういう場合、これを小数点を付けて表示する必要がある。やり方としては、「%d」でも100で割ると下2桁の小数点になる。つまり%dには整数が入っているが、計算によって少数点に変換されている。

COM1FREQ = dataref_table("sim/cockpit/radios/com1_freq_hz")
function show_ALT_parameters()
	-- %f=不動小数点、%d=整数、
	local info_to_print = string.format("%d", COM1FREQ[0])
		draw_string_Helvetica_18(200, 300, info_to_print/100)
end
do_every_draw("show_ALT_parameters()")

ところが同じ5桁の整数でも最後に0がつく場合「12620のような場合」100で割ると「126.20」になると思うのだが、結果「126.2」と表示されてしまう。

以下は最後に0がこない場合、問題なく小数点以下2桁で表示される。

不動小数点で問題なく表示する条件

最後が0でも問題なく桁数をコントロールするには、最初に必ず不動小数点に変換してから%fに入れること。これがポイントになる。

%fに入れる場合は整数でなく不動小数点で必ず入れる。その後「%6.2f」を使って全体の桁数と小数点以下の桁をコントロールする。これだと完全に桁数と小数点以下の桁数をコントロールできる。

従って、5行目で100で割っていたのを4行目のdataref値「COM1FREQ[0]」を100で先に割り、小数点に変換しておく。この時点で12620が126.2になる。
これを「%6.2f」に入れるとうまくコントロールできる。これは不動小数点の全体の数(小数点も数に入れる)126.20で「6」になり、小数点以下を2桁に変換するという意味に成る。

結果:126.20となる。

COM1FREQ = dataref_table("sim/cockpit/radios/com1_freq_hz")
function show_ALT_parameters()
	-- %f=不動小数点、%d=整数、
	local info_to_print = string.format("%6.2f", COM1FREQ[0]/100)
		draw_string_Helvetica_18(200, 300, info_to_print)
end
do_every_draw("show_ALT_parameters()")

ポイント:%fに入れる場合は不動小数点の数値を入れること。

126.20と「%6.2f」と指定通りの桁で表示されるようになる。

もし、7セグ表示のように126.200と小数点以下3桁で表示したい場合は「%7.3f」とすえば良い。

もう一つの問題として実際の画面には6桁で表示され、dataref値は5桁である。実際は5桁でも問題は無いのだが、これは6桁でちゃんと表示するdataref値が別のところにある。
sim/cockpit2/radios/actuators/com1_frequency_hz_833では、6桁で表示されている。