GDScript Zeichenketten formatieren

GDScript bietet ein Funktion namens Zeichenketten formatieren, die es ermöglicht, Textvorlagen wieder zu benutzen, um schnell unterschiedliche, aber ähnliche Zeichenketten zu erzeugen.

Formatierte Zeichenketten sind wie normale Zeichenketten, mit der Ausnahme, dass sie bestimmte Platzhalter für Zeichensequenzen enthalten. Diese Platzhalter können einfach durch Parameter in der formatierten Zeichenkette ersetzt werden.

Beispielsweise kann mit %s als ein Platzhalter die formatierte Zeichenkette "Hallo %s, wie geht es dir? einfach zu "Hallo Welt, wie geht es dir?" geändert werden. Bemerke, dass der Platzhalter mitten in der Zeichenkette ist, ihn ohne Formatierung zu bearbeiten kann sehr mühsam sein.

Verwendung in GDScript

Versuche, das folgende GDScript-Beispiel zu verstehen:

# 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."

Platzhalter starten immer mit einem %, aber das nächste oder die nächsten Zeichen, der Formatkennzeichner, legt fest, wie der gegebene Wert zu einer Zeichenkette konvertiert wird.

Das %s``im Beispiel oben ist der einfachste Platzhalter und funktioniert in den meisten Fällen: er konvertiert den Wert mit der gleichen Methode, von welcher eine implizierte Zeichenketten-Konvertierung oder ``str() es konvertieren würde. Zeichenketten bleiben unverändert. Schalter schalten entweder in "True" (wahr) oder "False" (falsch), eine integrale oder reale Nummer wird decimal, andere Typen geben meist ihre Daten in einer lesbaren Zeichenkette zurück.

Es gibt auch einen anderen Weg, um Text in GDScript zu formatieren, vor allen Dingen die String.format() Methode. Sie ersetzt alle Schlüssel in der Zeichenkette mit dem entsprechenden Wert. Die Methode kommt mit Arrays oder Wörterbüchern (Dictonary) für das Schlüssel/Wert-Paar klar.

Arrays können als Schlüssel, Index oder in gemixtem Stil (siehe untere Beispiele) vorkommen. Die Reihenfolge ist nur wichtig, wenn der Index oder der gemixte Stil des Arrays benutzt wird.

Ein kurzes Beispiel in 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"

Es gibt auch andere Formatbezeichner, aber diese sind nur anwendbar, beim Benutzen des %-Operators.

Mehrere Platzhalter

Formatierte Zeichenketten können mehrere Platzhalter enthalten. In diesem Fall werden die Werte in der Form eines Arrays gehandhabt, ein Wert pro Platzhalter (außer es wird ein Formatbezeichner mit * genutzt, siehe dynamic padding):

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."

Bemerke, dass die Werte in der Reihenfolge eingefügt werden. Denke daran, dass alle Platzhalter auf einmal ersetzt werden müssen, es muss also eine angemessene Anzahl an Werten geben.

Formatbezeichner

Es gibt weitere Formatbezeichner außer s, die in Platzhaltern genutzt werden können. Diese bestehen aus einem oder mehreren Zeichen. Manche funktionieren für sich alleine, wie s, manche stehen vor anderen Zeichenketten, wieder andere funktionieren in Verbindung mit bestimmten Werten oder Zeichenketten.

Platzhalter-Typen

Einer – und nur einer – dieser Platzhalter-Typen muss immer als letztes Zeichen in einem Formatbezeichner auftreten. Abgesehen von s werden bestimmte Parametertypen benötigt.

s Einfache Konvertierung von einer Zeichenkette mit der selben Methode, die bei der Konvertierung von impliziten Zeichenketten genutzt wird.
c Ein einzelnes Unicode Zeichen. Erwartet einen vorzeichenlosen 8-bit Ganzzahltyp (0-255) für einen Codepunkt oder eine Zeichenkette bestehend aus einem einzelnen Zeichen.
d Eine **dezimale Ganz**zahl. Erwartet eine ganze oder reelle Zahl (wird abgerundet).
o Eine **oktale Ganz**zahl. Erwartet eine ganze oder reelle Zahl (wird abgerundet).
x Eine hexadezimale Ganz**zahl mit **Kleinbuchstaben. Erwartet eine ganze oder reelle Zahl (wird abgerundet).
X Eine hexadezimale Ganz**zahl mit **Großbuchstaben. Erwartet eine ganze oder reelle Zahl (wird abgerundet).
f Eine **reelle Dezimal**zahl. Erwartet eine ganze oder reelle Zahl.

Platzhalter-Modifikatoren

Diese Zeichen erscheinen vor den obigen. Einige davon funktionieren nur unter bestimmten Bedingungen.

+ Bei Zahlen-Bezeichnern das + Vorzeichen mit angeben, falls die Zahl positiv ist.
Ganze Zahl Set padding. Padded with spaces or with zeroes if integer starts with 0 in an integer placeholder. When used after ., see ..
. Vor f setzt es die Präzision auf 0 Nachkommastellen. Kann von einer Zahl gefolgt werden, um dies zu ändern. Wird notfalls mit Nullen aufgefüllt.
- Nach rechts auffüllen statt nach links.
* Dynamisches Auffüllen, erwarte zusätzlichen ganzzahligen Parameter nach . um den Abstand oder die Genauigkeit zu definieren, siehe auch dynamic padding.

Versatz

Die Zeichen . (Punkt), * (Sternchen), - (Minus) und die Ziffern (0-9) werden für das Auffüllen benutzt. Dies erlaubt die Ausgabe mehrerer Werte mit vertikaler Ausrichtung wie in einer Spalte, vorausgesetzt, eine Schrift mit festgelegter Breite wird verwendet.

Um eine Zeichenfolge auf eine Minimallänge aufzufüllen, füge eine Ganzzahl zu dem Bezeichner hinzu:

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

Falls die Ganzzahl mit 0 beginnt, werden die Ganzzahlwerte mit Nullen aufgefüllt anstatt mit Leerzeichen:

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

Die Genauigkeit für reelle Zahlen kann durch das Hinzufügen von . (Punkt) und einer darauffolgenden Ganzzahl festgelegt werden. Ohne Ganzzahl nach . wird eine Genauigkeit von 0 genutzt, wobei auf einen ganzzahligen Wert gerundet wird. Die Anzahl der Füllzeichen muss vor dem Punkt angegeben werden.

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

Das Zeichen - führt zu einem Auffüllen der Abstände von links anstatt von rechts und kann für rechtsbündigen Text verwendet werden:

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

Dynamischer Abstand

By using the * (asterisk) character, the padding or precision can be set without modifying the format string. It is used in place of an integer in the format specifier. The values for padding and precision are then passed when formatting:

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

Es ist weiterhin möglich, Ganzzahl-Platzhalter mit Nullen aufzufüllen, indem 0 vor * eingefügt wird:

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

Escape-Sequenz

Um das Zeichen % selbst in einen Format-Zeichenkette einzubauen, muss dieses „escaped“ (gekennzeichnet) werden, damit es nicht als Platzhalter aufgefasst wird. Dies schafft man durch das Verdoppeln des Zeichens:

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

Beispiele für Formatierungsverfahren

Im Folgenden sind einige Beispiele für die verschiedenen Aufrufarten der String.format-Methode.

Typ Stil Beispiel Ergebnis
Wörterbuch Schlüsselbild "Hallo, {name} v{version}!".format({"name":"Godette", "version":"3.0"}) Hallo, Godette v3.0!
Wörterbuch Index "Hallo, {0} v{1}!".format({"0":"Godette", "1":"3.0"}) Hallo, Godette v3.0!
Wörterbuch Mix "Hallo, {0} v{version}!".format({"0":"Godette", "version":"3.0"}) Hallo, Godette v3.0!
Array Schlüsselbild "Hallo, {name} v{version}!".format([["version":"3.0"], ["name":"Godette"]]) Hallo, Godette v3.0!
Array Index "Hallo, {0} v{1}!".format(["Godette","3.0"]) Hallo, Godette v3.0!
Array Mix "Hallo, {name} v{0}!".format([3.0, ["name":"Godette"]]) Hallo, Godette v3.0!
Array kein Index "Hallo, {} v{}".format(["Godette", "3.0"], "{}") Hallo, Godette v3.0!

Platzhalter können auch bei String.format angepasst werden, hier einige Beispiele zu dieser Funktionalität.

Typ Beispiel Ergebnis
Infix (Standard) "Hallo, {0} v{1}".format(["Godette", "3.0"], "{_}") Hallo, Godette v3.0
Postfix "Hallo, 0% v1%".format(["Godette", "3.0"], "_%") Hallo, Godette v3.0
Prefix "Hallo, %0 v%1".format(["Godette", "3.0"], "%_") Hallo, Godette v3.0

Es kann sinnvoll sein, die String.format-Methode mit dem % Operator zu kombinieren, da mit String.format keine Möglichkeit besteht, die Repräsentation von Zahlen zu beeinflussen.

Beispiel Ergebnis
"Hallo, {0} v{version}".format({0:"Godette", "version":"%0.2f" % 3.114}) Hallo, Godette v3.11