0Pricing
Lua Academy · レッスン

出力のためのstring.format

%s、%d、%fなどの書式指定子を使って文字列を整形します。

「出力のためのstring.format」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。

string.format の基本

string.format(fmt, ...)は、C形式のフォーマット指定子を使って値を整形します。整形済みの文字列を返します。フォーマット文字列にはリテラルテキストと、%で始まる変換指定子を含めます。Luaで正確な出力を生成する主な方法です。

print(string.format("Hello, %s!", "Lua"))      -- Hello, Lua!
print(string.format("Pi is %.4f", math.pi))   -- Pi is 3.1416
print(string.format("%d items at $%.2f each", 5, 2.99))

整数用の %d と %i

%dと%iは整数を整形します。幅を追加するとパディングできます。%5dは5文字幅で右寄せし、%-5dは左寄せします。%05dはゼロでパディングします。これらの指定子は浮動小数点数を切り捨てるため、必要に応じて先にmath.floor()を使ってください。

print(string.format("%d",  42))       -- 42
print(string.format("%5d", 42))       --    42 (right-aligned)
print(string.format("%-5d|", 42))     -- 42   | (left-aligned)
print(string.format("%05d", 42))      -- 00042
print(string.format("%+d", 42))       -- +42

浮動小数点数用の %f と %e

%fは固定小数点表記、%eは指数表記で整形します。%gは短い方の表記を選びます。精度指定子(例:%.2f)で小数点以下の桁数を指定します。デフォルトの精度は6です。

print(string.format("%.2f",  3.14159)) -- 3.14
print(string.format("%10.3f", 3.14))   --      3.140
print(string.format("%e", 12345.678))  -- 1.234568e+04
print(string.format("%.2e", 0.001))    -- 1.00e-03
print(string.format("%g", 100.0))      -- 100

文字列用の %s

%sは文字列を挿入します。文字列以外の値はtostringで変換されます。幅と配置は数値の場合と同じように指定できます。%qはLuaで読み取り可能な形式(エスケープを含む)で文字列を引用符付きにします。シリアライズに便利です。

print(string.format("%-10s|", "hi"))   -- hi        |
print(string.format("%10s|", "hi"))    --         hi|
print(string.format("%.3s", "hello"))  -- hel (truncate)
print(string.format("%q", 'say "hi"'))-- "say \"hi\""
print(string.format("%s=%s", "key","val")) -- key=val

その他の基数用の %x と %o

%xは整数を16進数(小文字)で、%Xは大文字の16進数で、%oは8進数で、%uは符号なし整数として整形します。ビットマスクの表示、カラーコード、低レベルプログラミングなどに便利です。

print(string.format("%x",  255))   -- ff
print(string.format("%X",  255))   -- FF
print(string.format("%#x", 255))   -- 0xff (with prefix)
print(string.format("%o",  8))     -- 10 (octal)
print(string.format("%08x", 0xDEAD)) -- 0000dead

複数の値

フォーマット指定子の数と同じ数の引数を渡してください。引数の数は一致させる必要があります。少なすぎるとエラーになり、余分な引数は無視されます。フォーマット文字列を使うと、表、ログ、レポートなどの構造化された出力を作成できます。

local function printRow(name, score, grade)
  print(string.format("%-12s  %3d  %s", name, score, grade))
end

printRow("Alice",    95, "A")
printRow("Bob",      87, "B")
printRow("Carol",    91, "A")
-- Alice         95  A
-- Bob           87  B
-- Carol         91  A

フォーマットテンプレートの作成

フォーマット文字列を定数として保存すると、再利用できます。出力の一貫性を保ち、1か所を変更するだけでフォーマットを変更できるようになります。文字列フォーマットは、ロギング、CSV出力、レポート生成の基盤です。

local LOG_FMT = "[%s] %s: %s"

local function log(level, module, msg)
  print(string.format(LOG_FMT, level, module, msg))
end

log("INFO",  "server", "started on port 8080")
log("WARN",  "db",     "connection pool low")
log("ERROR", "auth",   "token expired")

パディングと配置

幅指定子を使うと、出力を揃えられます。正の幅は右寄せ、負の幅は左寄せになります。列を揃える必要がある表やレポートで特に便利です。string.repと組み合わせて区切り線を作成することもできます。

local fmt = "%-15s %6s %8s"
print(string.format(fmt, "Name", "Score", "Grade"))
print(string.rep("-", 31))
local data = {{"Alice",95,"A"},{"Bob",87,"B"},{"Dave",78,"C"}}
for _, r in ipairs(data) do
  print(string.format(fmt, r[1], r[2], r[3]))
end

%c と %% のリテラル

%cは整数を対応するASCII文字に変換します。%%はリテラルのパーセント記号を生成します。特殊文字を生成したり、フォーマット文字列に%を含めたりする場合に便利です。

print(string.format("%c%c%c", 76, 117, 97))  -- Lua
print(string.format("100%%"))                -- 100%
print(string.format("%.1f%%", 87.5))         -- 87.5%

-- Build a progress bar
local pct = 65
local filled = math.floor(pct / 5)
local bar = "[" .. string.rep("#",filled) .. string.rep(".",20-filled) .. "]"
print(bar .. " " .. pct .. "%")

string.format と tostring の比較

単純に任意の型を変換する場合はtostringを使い、精度の制御、パディング、複数の値の整形にはstring.formatを使います。string.format("%s", val)は、文字列への変換時に内部でtostringを呼び出します。

-- tostring: simple, any type
print(tostring(3.14))      -- 3.14
print(tostring(true))      -- true
print(tostring(nil))       -- nil

-- string.format: precision + structure
print(string.format("%.2f", 3.14159))  -- 3.14
print(string.format("%d", 255))        -- 255
-- print(string.format("%d", true))    -- ERROR

確認問題

string.format("%05.2f", 3.1)は何を生成しますか。

まとめ:string.format

まとめ:

  • %sは文字列、%dは整数、%fは浮動小数点数、%xは16進数です
  • 幅:%10dは右寄せ、%-10dは左寄せ、%010dはゼロでパディングします
  • 精度:%.2fは小数点以下2桁、%.3sは3文字です
  • %qはLuaで解析できるように文字列を引用符付きにします
  • %%はリテラルのパーセント記号です

よくある質問

「出力のためのstring.format」レッスンは無料ですか?

はい。「出力のためのstring.format」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。

「出力のためのstring.format」で何を学びますか?

%s、%d、%fなどの書式指定子を使って文字列を整形します。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Lua Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「出力のためのstring.format」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このLua Academyレッスンでコードを書いて実行できますか?

はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 文字列の基礎:連結と長さ
  2. 部分文字列の検索と抽出
  3. 出力のためのstring.format
  4. string.gsubとstring.gmatch
← Lua Academyに戻る