Тема: Форматирование строк в CoreLite
Одним из проектов по дальнейшему развитию CoreLite является разработка собственной реализации форматирования строк:
Str.Format('Total % files, % bytes', [FileCount, TotalSize]);
Шаблоны формата будут иметь собственный синтаксис, использующий возможности открытых массивов Delphi. Странно, но ни в одном известном мне форматировщике они не используются. Открытый массив объявляется так:
procedure TWideString.Format(Fmt: PWideChar; Args: array of const);
При формировании открытого массива, объявленного таким образом, Delphi помещает тип каждого элемента в массив. Следовательно, нет необходимости задавать тип параметра, если достаточно представления по умолчанию.
Пока принят следующий синтаксис символа формата:
%[+][-][width|*][x|X|%]
Где:
Ширина (width) задается десятичным числом или символом *, если ширина передается в списке параметров. Лидирующий 0 задает дополнение нулями. Знак - — выравнивание по левому краю, знак + — выводить + для положительных чисел. Знаки могут идти в любом порядке. Возможна также поддержка символа ±.
Символы x или X задают вывод в шестнадцатиричном формате. На данный момент это единственное альтернативное представление.
Завершающий знак процента заставляет интерпретировать число как процент, то есть умножать его на 100 при выводе.
В будущем возможно добавление индекса параметра в стеке:
%0:25
Согласно постановке, форматировщик должен форматировать числа в соответствии с локалью пользователя. Наверное, для этого придется ввести еще одно альтернативное представление, обозначаемое символом n.
Этот проект — долгострой CoreLite. В разные годы несколько раз писалась постановка, были даже попытки начать реализацию. В ветке master на GitHub модуль CoreStrings до сих пор содержит заготовку одной из реализаций. Сейчас решено сделать самый простой вариант.
Предполагается, что после реализации CoreLite перейдет на него полностью, включая исключения. Наконец-то будет решена проблема вывода знака уменьшения/приращения в PE Tool. Сейчас для вывода форматированных строк используется обертка над системной функцией wvsprintf.