# format

Команда форматирует строку в стиле процедуры 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.
% | Просто подставляет символ %.

Для числовых преобразований аргумент должен быть целым числом или десятичным с плавающей точкой. Аргумент преобразуется в двоичное число, а затем преобразуется обратно в строку в соответствии с указанным типом преобразования.

## ОТЛИЧИЯ ОТ ANSI SPRINTF

Поведение команды format отличается от процедуры sprintf в следующих моментах:

1. %p и %n типы не поддерживаются.
2. Для %c аргумент должен быть десятичным числом.

При преобразованиях длины значение l игнорируется.