Команда форматирует строку в стиле процедуры sprintf.
format formatString ?arg arg...?
Данная команда создает и возвращает программе форматированную строку так же, как это делает процедура ANSI C sprintf (эта процедура используется в реализации команды). Подобно sprintf, formatString указывает с помощью спецификаторов преобразований,как именно сформатировать результат, а возможные дополнительные аргументы предназначены для подстановки в результат.
Команда немного отличается от sprintf в части отдельных спецификаторов и ключей.
Команда просматривает строку formatString слева направо. Все символы из строки непосредственно переносятся в результирующую строку, кроме символа % и следующих непосредственно за ним. Такая последовательность символов рассматривается как спецификатор преобразования. Этот спецификатор управляет преобразованием очередного аргумента arg в указанный формат, после чего тот добавляется к результирующей строке вместо соответствующего спецификатора. Если в строке formatString содержится несколько спецификаторов, каждый из них управляет преобразованием одного дополнительного аргумента. Число таких аргументов должно быть достаточным для всех спецификаторов в строке.
Каждый из спецификаторов преобразования может содержать до шести различных частей: указатель позиции, набор флагов, минимальная ширина поля, точность, преобразователь длины и тип преобразования. Любые из полей, кроме типа преобразования, могут отсутствовать. Ниже обсуждаются соответствующие разделы спецификаторов.
Если за символом % следуют целое число и знак $, как например в %2$d, то величина для преобразования берется не из следующего аргумента, а из аргумента, занимающего соответствующую позицию в списке (1 соответствует первому аргументу arg). Если спецификатор преобразования требует нескольких аргументов (когда он содержит символ *), то используются последовательные аргументы, начиная с указанного. Если один из спецификаторов содержит указание позиции аргумента, то и все остальные спецификаторы должны его содержать.
Второй раздел спецификатора может содержать в произвольном порядке любые флаги из перечисленных ниже.
- | Указывает, что соответствующий аргумент будет выровнен влево (числа обычно выравниваются вправо с добавлением лидирующих пробелов при необходимости). |
+ | Указывает, что числа всегда будут вставлены со знаком, даже если они положительные. |
space | Указывает, что перед числом будет добавлен пробел, если первый символ не знак. |
0 | Указывает, что число будет выровнено с добавлением лидирующих нулей. |
# | Указывает на использование альтернативной формы вывода. Для o и O преобразований гарантирует, что первой цифрой всегда будет 0. Для x и X преобразований - что 0x или 0X соответственно будет добавлен в начало числа. Для e, E, f, g, и G - что в числе будет использована десятичная точка. Для g и G - что конечные нули не будут отброшены. |
Третья часть спецификатора преобразования представляет собой число, задающее минимальную ширину поля для данного преобразования. Обычно она используется для формирования данных в таблицу. Если преобразуемое значение не содержит указанного числа символов, одно будет дополнено до необходимого размера. Обычно поле заполняется пробелами слева, однако, указанные выше флаги 0 и - позволяют заполнять его нулями слева или пробелами справа. Если минимальная ширина поля указана как *, а не как число, то в качестве числового значения используется значение следующего аргумента в команде.
Четвертая часть спецификатора определяет точность представления чисел. Она состоит из точки и последующего числа. Число имеет различный смысл при различных преобразованиях. Для e, E и f преобразования оно определяет число цифр справа от десятичной точки. Для g и G - общее число чисел слева и справа от десятичной точки (однако, конечные нули будут обрезаться, если не указан флаг #). Для целочисленных преобразований оно определяет минимальное число символов (при необходимости будут добавляться лидирующие нули). Для s преобразований определяет максимальное число символов, которое будет выводиться. Если строка длиннее, конечные символы будут отброшены. Если точность указана как *, а не как число, то в качестве числового значения используется значение следующего аргумента в команде.
Пятая часть спецификатора может принимать значения hили l. Значение h означает, что все числовые значения предварительно обрезаются до 16 бит. Значение l означает, что никаких предварительных преобразований не производится.
Последняя часть спецификатора представляет собой букву, которая определяет тип преобразования. Допускаются следующие значения.
d | Преобразует целое число в десятичную строку со знаком. |
u | Преобразует целое число в десятичную строку без знака. |
i | Преобразует целое число в десятичную строку со знаком. Целое может быть десятичным, восьмеричным (с 0 вначале) или шестнадцатеричным (с 0x вначале). |
o | Преобразует целое число в восьмеричную строку без знака. |
x or X | Преобразует целое число в шестнадцатиричную строку без знака. Используются символы `0123456789abcdef'' для x и ``0123456789ABCDEF'' для X. |
c | Преобразует целое число в восьмибитный символ, который оно представляет. |
s | Не преобразует, но просто вставляет строку |
f | Преобразует число с плавающей точкой в десятичное со знаком в форме xx.yyy, где число символов после запятой определяется точностью. |
e or E | Преобразует число с плавающей точкой в число в экспоненциальной форме x.yyye╠zz, где число символов после запятой определяется точностью (по умолчанию 6). Для E в записи числа используется E вместо e. |
g or G | Если порядок числа меньше -4 или больше, чем точность, или равен точности, преобразует число с плавающей точкой как %e или %E. В противном случае преобразует как %f. |
% | Просто подставляет символ %. |
Для числовых преобразований аргумент должен быть целым числом или десятичным с плавающей точкой. Аргумент преобразуется в двоичное число, а затем преобразуется обратно в строку в соответствии с указанным типом преобразования.
Поведение команды format отличается от процедуры sprintf в следующих моментах:
При преобразованиях длины значение l игнорируется.