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 игнорируется.