Строки формата GDScript

GDScript offers a feature called format strings, which allows reusing text templates to succinctly create different but similar strings.

Форматированные строи аналогичны обычным строкам, за исключением того, что они содержат определенные последовательности символов-заполнителей. Эти заполнители могут быть легко заменены параметрами, переданными в отформатированную строку строку.

В качестве примера, с %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 , показанный в приведенном выше примере, является простейшим заполнителем и работает для большинстве случаев: он преобразует значение тем же методом, с помощью неявного преобразования String или как str(). Строки остаются неизменными, логические значения превращаются в "True" или "False", целочисленное или вещественное число становится десятичным, другие типы обычно возвращают свои данные в удобочитаемую строку.

Существует также другой способ форматирования текста в 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"

Существуют другие format specifiers, но они применимы только при использовании оператора %.

Несколько заполнителей

Строки формата могут содержать несколько заполнителей. В таком случае значения передаются в виде массива, по одному значению на заполнитель (если не используется спецификатор формата *, см. динамическое заполнение):

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, которые могут быть использованы как заполнители. Они состоят из одного или нескольких символов. Некоторые из них работают сами по себе, как s, некоторые встречаются перед другими символами, некоторые работают только с определенными значениями или символами.

Типы заполнителей

Один и только один из них должен всегда отображаться как последний символ в спецификаторе форматирования. Помимо s, они требуют определенные типы параметров.

s Simple преобразование в строку осуществляется тем же методом, что и неявное преобразование строки.
c Unicode character. Ожидает одно 8-разрядное целое число без знака (0-255) таблицы символов или односимвольную строку.
d Decimal integral. Ожидает целое или вещественное число (будет выведено десятичное число).
o Octal integral. Ожидает целое или вещественное число (будет выведено восьмеричное число).
x Hexadecimal integral с дополнительным параметром lower-case. Ожидает целое или или вещественное число (будет выведено шестнадцатеричное число с буквами в нижнем регистре).
X Hexadecimal integral с дополнительным параметром upper-case. Ожидает целое или или вещественное число (будет выведено шестнадцатеричное число с буквами в верхнем регистре).
f Decimal real. Ожидает целое или вещественное число (будет выведено десятичное целое или вещественное число).

Модификаторы-заполнители

Эти символы появляются перед вышеуказанными. Некоторые из них работают только при определенных условиях.

+ В спецификаторах чисел, show + sign показывает знак + если число положительное.
Integer Установить заполнение padding. Заполняется пробелами или нулями, если целое число начинается с 0 в целочисленном заполнителе. При использовании после ., см. ..
. Перед f установите precision точность в 0 знаков после запятой. В дальнейшем число знаков после запятой можно изменить. Заполняются нулями.
- Pad to the right заполнение справа, а не слева.
* Динамический отступ это дополнительный интегральный параметр для настройки отступов или точности после ., смотрите динамический отступ.

Отступ

Символы . (точка), * (звездочка), - (знак минус) и цифры (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 перед *:

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

Escape-последовательность

Чтобы вставить литерал % в строку форматирования, он должен быть экранирован, чтобы не читать его в качестве заполнителя. Это делается путем дублирования символа:

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

Примеры методов форматирования

Далее следуют несколько примеров того, как использовать различные вариации метода String.format.

Тип Стиль Пример Результат
Словарь ключ "Hi, {name} v{version}!".format({"name":"Godette", "version":"3.0"}) Привет, Godette v3.0!
Словарь индекс "Hi, {0} v{1}!".format({"0":"Godette", "1":"3.0"}) Привет, Godette v3.0!
Словарь Сочетание "Hi, {0} v{version}!".format({"0":"Godette", "version":"3.0"}) Привет, Godette v3.0!
Массив ключ "Hi, {name} v{version}!".format([["version","3.0"], ["name","Godette"]]) Привет, Godette v3.0!
Массив индекс "Hi, {0} v{1}!".format(["Godette","3.0"]) Привет, Godette v3.0!
Массив Сочетание "Hi, {name} v{0}!".format([3.0, ["name","Godette"]]) Привет, Godette v3.0!
Массив no index "Hi, {} v{}!".format(["Godette", 3.0], "{}") Привет, Godette v3.0!

Заполнители также могут быть настроены при использовании String.format. Вот несколько примеров этого функционала.

Тип Пример Результат
Infix (по умолчанию) "Hi, {0} v{1}".format(["Godette", "3.0"], "{_}") Привет, Godette v3.0
Постфикс "Hi, 0% v1%".format(["Godette", "3.0"], "_%") Привет, Godette v3.0
Префикс "Hi, %0 v%1".format(["Godette", "3.0"], "%_") Привет, Godette v3.0

Combining both the String.format method and the % operator could be useful, as String.format does not have a way to manipulate the representation of numbers.

Пример Результат
"Hi, {0} v{version}".format({0:"Godette", "version":"%0.2f" % 3.114}) Привет, Godette v3.11