Справочная статья
Строковые литералы и интерполяция
Готовый текст записывается в программе строковым литералом, а если в него нужно вставить вычисленное значение — интерполированной строкой. Оба вида дают выражение типа STRING, но подчиняются разным правилам записи: в обычном литерале текст берётся как есть, в интерполированном часть строки вычисляется и подставляется в результат.
Кавычки и пустая строка
Обычный литерал заключается в двойные кавычки, а две кавычки внутри литерала обозначают одну кавычку в результате. Пустой литерал записывается как "". На следующую физическую строку обычный литерал не продолжается.
PRINT "Он сказал ""Привет""."Результат:
Он сказал "Привет".Вставка выражения
Интерполированная строка начинается с $". Неизменяемые части текста задаются прямо, а вычисляемая вставка записывается в фигурных скобках и может иметь любой тип, для которого доступно обычное отображение. Выражение вычисляется по общим правилам, и его результат становится частью строки. Одиночная открывающая скобка в тексте начинает вставку, поэтому буквальная скобка записывается удвоенной; подробности — в следующем разделе.
$"<текст>{<выражение>}<текст>"Вставка может содержать другую интерполированную строку, в том числе в аргументе функции. Внутренняя строка вычисляется как отдельное выражение, и её окончание возвращает разбор во внешнюю вставку:
PRINT $"a{$"b{1}c"}d"
PRINT $"{LEN($"x{2}")}"Результат:
ab1cd
2Форматирование программы в стилях Classic и Modern сохраняет текст внешней и внутренней строк, выражения, числовые форматы и выравнивание.
Текст внутри интерполяции
Текстовая часть интерполированной строки подчиняется собственным правилам записи. Открывающая фигурная скобка начинает вставку, поэтому одиночная скобка в тексте записывается удвоенной: {{ даёт {. Закрывающая скобка записывается так же: }} даёт }. Двойная кавычка внутри интерполяции записывается двумя кавычками, как и в обычном литерале: "" даёт ".
PRINT $"{{x}}" ' {x}
PRINT $"a""b" ' a"b
PRINT $"e{{f" ' e{f
PRINT $"g}}h" ' g}h
Обратная косая черта не является экраном и выводится как есть: $"c\d" даёт c\d. Запись \{ экраном не считается, поэтому после обратной косой черты начинается вставка выражения.
Интерполированная строка, как и обычный литерал, не продолжается на следующей физической строке. Перевод строки внутри $"…" завершает литерал и вызывает ошибку MB0002 с позицией начала строки; последующие строки программы читаются как обычный код.
Формы вставки
Вставка записывается в четырёх видах: только выражение, выражение с выравниванием, выражение с числовым форматом и обе части вместе.
{<выражение>}{<выражение>,<выравнивание>}{<выражение>:<формат>}{<выражение>,<выравнивание>:<формат>}Выравнивание — целочисленный литерал минимальной ширины поля: положительное значение дополняет поле слева, отрицательное справа, а длинный результат не обрезается. Ширина измеряется в единицах UTF-16. Числовой формат применяется первым, выравнивание — после него.
Пробелы по краям спецификатора формата не значимы: записи {n:F2}, {n: F2} и {n:F2 } дают одинаковый результат. Пробел после запятой относится к записи выравнивания, а не к формату.
Числовые форматы
| Формат | Назначение |
|---|---|
F, F2 | Фиксированное количество знаков после десятичной точки. |
N, N0 | Число с разделителями групп разрядов. |
E, E3 | Экспоненциальное представление. |
P, P1 | Процент: значение умножается на 100. |
B, B8 | Двоичное представление целого числа с минимальным количеством цифр. |
X, X4 | Шестнадцатеричное представление целого числа. |
D, D3 | Целое число с минимальным количеством цифр и ведущими нулями. |
G, G3 | Общее числовое представление. |
Таблица перечисляет часто используемые форматы; сам формат передаётся числовому форматированию .NET после перевода букв в верхний регистр. Число после буквы уточняет точность или минимальную ширину числовой записи. D, X и B применяются только к INTEGER и LONG, а F, N, E, P и G — к числовым типам. Для нечисловых значений спецификатор игнорируется и используется обычное отображаемое значение.
Правила X/B для отрицательных чисел, ведущие нули и отличие числового значения от записи описаны в статье систем счисления. Неверный числовой формат или применение X/B к дробному типу вызывает перехватываемую ошибку MB3007.
Без формата используется обычное текстовое представление значения. Десятичный разделитель — точка; региональные настройки не меняют результат.
В следующем примере вставки объединяют числовой формат и ширину поля:
DIM count AS INTEGER = 7
DIM price AS DOUBLE = 12.5
PRINT $"Количество: {count:D3}"
PRINT $"Цена: {price:F2}"
PRINT $"Поле: |{count,3}|"Результат:
Количество: 007
Цена: 12.50
Поле: | 7|Формат D3 доводит число до трёх цифр ведущими нулями, F2 добавляет второй дробный разряд, а выравнивание шириной 3 дополняет поле слева.
Предельная длина результата
Итоговый текст и ширина поля выравнивания подчиняются пределу STRING в 16 777 216 единиц UTF-16. Превышение вызывает MB3007; ошибку можно обработать через TRY/CATCH.
Диагностика
Незавершённый литерал вызывает MB0002; это относится и к обычному литералу, и к интерполированной строке, которая не закрыта до конца физической строки или до конца файла. Вставленное выражение проверяется по общим правилам имён и типов; неизвестное имя вызывает MB2001, несовместимое использование — MB2003. Недопустимый числовой формат во время выполнения вызывает MB3007 и может быть обработан через TRY/CATCH.