GDScriptフォーマット文字列

GDScriptはフォーマット文字列と呼ばれる機能を提供します。これはテキストテンプレートを再利用して、異なるが似ている文字列を簡潔に作成することを可能にします。

フォーマット文字列は、特定のプレースホルダ文字シーケンスを含むことを除けば、通常の文字列とまったく同じです。これらのプレースホルダは、フォーマット文字列に渡されるパラメータに簡単に置き換えることができます。

例として、プレースホルダとして %s を使用すると、フォーマット文字列 "Hello %s, how are you?" は簡単に "Hello World, how are you?" に変更できます。フォーマット文字列なしでは面倒かもしれません。

GDScriptでの使用

具体的なGDScriptの例を見てみましょう:

# Define a format string with placeholder '%s'
var format_string = "We're waiting for %s."

# Using the '%' operator, the placeholder is replaced with the desired value
var actual_string = format_string % "Godot"

print(actual_string)
# Output: "We're waiting for Godot."

プレースホルダは常に % で始まりますが、次の文字(format specifier)は、指定された値を文字列に変換する方法を決定します。

上記の例で見られる %s は最も単純なプレースホルダで、ほとんどの場合で機能します。暗黙の文字列変換または str() が変換するのと同じ方法で値を変換します。 文字列は変更されません。ブール値は "True" または "False" に変わります。整数または実数は10進数になります。他の型は通常、人間が読める文字列でデータを返します。

GDScriptでテキストをフォーマットする別の方法、すなわち String.format() メソッドもあります。文字列内に出現するすべてのキーを対応する値に置き換えます。 このメソッドは、キー/値ペアの配列または辞書を処理できます。

配列はキー、インデックス、または混合スタイルとして使用できます(下記の例を参照)。配列のインデックスまたは混合スタイルが使用されている場合にのみ順序が重要になります。

GDScriptの簡単な例:

# Define a format string
var format_string = "We're waiting for {str}"

# Using the 'format' method, replace the 'str' placeholder
var actual_string = format_string.format({"str": "Godot"})

print(actual_string)
# Output: "We're waiting for Godot"

他の 書式指定子 もありますが、 % 演算子を使用する場合にのみ適用できます。

複数のプレースホルダ

フォーマット文字列には複数のプレースホルダを含めることができます。そのような場合、値は配列の形で渡され、プレースホルダごとに1つの値になります( * でフォーマット指定子を使用しない限り。 動的パディング を参照):

var format_string = "%s was reluctant to learn %s, but now he enjoys it."
var actual_string = format_string % ["Estragon", "GDScript"]

print(actual_string)
# Output: "Estragon was reluctant to learn GDScript, but now he enjoys it."

値が順番に挿入されていることに注意してください。すべてのプレースホルダは一度に置き換えられる必要があるので、適切な数の値が必要です。

書式指定子

プレースホルダで使用できる書式指定子は、 s 以外にもあります。これらは1つ以上の文字で構成されます。その中には、 s のように単独で動作するものもあれば、他の文字の前に現れるものもあり、特定の値や文字だけで動作するものもあります。

プレースホルダ・タイプ

これらのうちの1つだけが、常にフォーマット指定子の最後の文字として表示されている必要があります。 s とは別に、これらは特定の種類のパラメータを必要とします。

s 暗黙的な文字列変換と同じメソッドによる文字列への単純な変換。
c 単一のUnicode文字。 コードポイントまたは1文字の文字列には、符号なし8ビット整数(0〜255)が必要です。
d 単一の10進整数。整数または実数(floorで切り捨てられます)を指定してください。
o 単一の8進整数。整数または実数(floorで切り捨てられます)を指定してください。
x 単一の小文字の16進整数。整数または実数(floorで切り捨てられます)を指定してください。
x 単一の大文字の16進整数。整数または実数(floorで切り捨てられます)を指定してください。
f 単一の10進実数。整数または実数を指定してください。

プレースホルダ修飾子

これらの文字は上記の前に表示されます。中には、特定の条件下でのみ機能するものもあります。

+ 数値指定子で、正の場合は+記号を表示します。
整数 パディングを設定します。 整数プレースホルダ内で整数が 0 で始まる場合は、スペースまたはゼロでパディングされます。後に . を使用する場合は、. を参照してください。
. f前に、精度を小数点以下0桁に設定します。 変更する数字でフォローアップすることができます。 ゼロでパディングされます。
- 左ではなく右にパディングされます。
* 動的パディング. の後にパディングまたは精度を設定するために追加の整数パラメータが必要です。動的パディング を参照してください。

パディング

. (ドット), * (アスタリスク), - (マイナス記号) および数字 (0-9) の文字が埋め込みに使用されます。これにより、固定幅フォントが使用されている場合に、縦に並んだ複数の値を列のように出力できます。

文字列を最小の長さにするには、指定子に整数を追加します:

print("%10d" % 12345)
# output: "     12345"
# 5 leading spaces for a total length of 10

整数が 0 で始まる場合、整数値は空白ではなくゼロでパディングされます:

print("%010d" % 12345)
# output: "0000012345"

. (ドット)を追加することで、実数に対して精度を指定できます。それに続く整数で``.`` の後に整数がないと、0の精度が使用され整数値に丸められます。パディングに使用する整数は、ドットの前になければなりません。

# Pad to minimum length of 10, round to 3 decimal places
print("%10.3f" % 10000.5555)
# Output: " 10000.556"
# 1 leading space

- 文字を使用すると、左ではなく右にスペースが挿入され、テキストの右揃えに便利です:

print("%-10d" % 12345678)
# Output: "12345678  "
# 2 trailing spaces

動的パディング

* (アスタリスク)文字を使用すると、フォーマット文字列を変更せずにパディングまたは精度を設定できます。フォーマット指定子の整数の代わりに使用されます。 フォーマット時にパディングと精度の値が渡されます:

var format_string = "%*.*f"
# Pad to length of 7, round to 3 decimal places:
print(format_string % [7, 3, 8.8888])
# Output: "  8.889"
# 2 leading spaces

* の前に 0 を追加することで、整数のプレースホルダに0を埋め込むこともできます:

print("%0*d" % [2, 3])
#output: "03"

エスケープシーケンス

フォーマット文字列にリテラルの % 文字を挿入するには、プレースホルダとして読み取られないようにエスケープする必要があります。これは文字を2倍にすることによって行われます:

var health = 56
print("Remaining health: %d%%" % health)
# Output: "Remaining health: 56%"

フォーマット方法の例

以下は、 String.format メソッドのさまざまな呼び出しの使用方法の例です。

様式 結果
辞書(ディクショナリ) キー "やあ、 {name} v{version}!".format({"name":"Godette", "version":"3.0"}) やあ、 Godette v3.0!
辞書(ディクショナリ) インデックス "やあ、 {0} v{1}!".format({"0":"Godette", "1":"3.0"}) やあ、 Godette v3.0!
辞書(ディクショナリ) キーとインデックス "やあ、 {0} v{version}!".format({"0":"Godette", "version":"3.0"}) やあ、 Godette v3.0!
配列 キー "やあ、 {name} v{version}!".format([["version","3.0"], ["name","Godette"]]) やあ、 Godette v3.0!
配列 インデックス "やあ、 {0} v{1}!".format(["Godette","3.0"]) やあ、 Godette v3.0!
配列 キーとインデックス "やあ、 {name} v{0}!".format([3.0, ["name","Godette"]]) やあ、 Godette v3.0!
配列 インデックスなし "やあ、 {} v{}!".format(["Godette", 3.0], "{}") やあ、 Godette v3.0!

String.format を使用するときにプレースホルダをカスタマイズすることもできます。これはその機能の例です。

結果
インフィックス(デフォルト) "やあ、 {0} v{1}".format(["Godette", "3.0"], "{_}") やあ、 Godette v3.0
ポストフィックス "やあ、 0% v1%".format(["Godette", "3.0"], "_%") やあ、 Godette v3.0
プレフィックス "やあ、 %0 v%1".format(["Godette", "3.0"], "%_") やあ、 Godette v3.0

String.format には数値の表現を操作する方法がないため、String.format メソッドと % 演算子の両方を組み合わせると便利です。

結果
"やあ、 {0} v{version}".format({0:"Godette", "version":"%0.2f" % 3.114}) やあ、 Godette v3.11