Форматирование и вывод строк. Printf C: описание, форматирование, примеры Php форматирование строк

Форматирование и вывод строк. Printf C: описание, форматирование, примеры Php форматирование строк

05.04.2024

Стандартная функция консольного вывода в языке C - printf. Описание её содержится в заголовочном файле stdio.h. При помощи этой функции можно выводить данные или пользовательские сообщения в консоль. Язык C чувствителен к регистру. К примеру, две функции printf и scanf отличаются от подобных им Printf и Scanf. Все символы в функциях printf и scanf также должны быть записаны в нижнем регистре. Одним из простейших примеров C printf, выводящим на экран знакомое приветствие hello world, является:

Определение функций группы printf в файле "stdio.h"

Файл "stdio.h" относится к стандартной библиотеке ввода/вывода в языке С. Описание printf и подобных ей функций приводится в нём следующим образом:

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

Семейство функций printf

Функции группы printf в языке C служат для обработки и форматированного вывода данных в стандартный поток. Причём функции printf и vprintf производят запись в стандартный поток stdout, функции fprintf и vfprintf отправляют значения выводимых аргументов в некоторый заданный выходной поток, а snprintf, sprintf, vsnprintf и vsprintf записывают данные в символьную строку. Все перечисленные функции работают с использованием строки формата, указывающей необходимые преобразования аргументов для вывода.

Функция fprintf записывает результат в выходной поток stream. В буфер, представляющий собой символьную строку, выводит результат функция sprintf. Поведение функции не определено, если подлежащая выводу строка превышает размер массива буфера.

Функция snprintf так же, как и предыдущая, записывает данные в строковый буфер. Полученная строка символов завершается нулевым символом, если только bufsz (размер буфера) не равен нулю. Иначе, если значение bufsz равно нулю, то в буфер ничего не выводится, а сам буфер вполне может являться нулевым указателем, но возвращаемое значение (количество байтов, которое должно было быть записано) все равно вычисляется.

Функция printf_s в целом действует тем же образом, что и printf, за исключением одного момента. Главным отличием в описании printf_s в C и printf является следующее: функция printf_s выполняет проверку строки форматирования на наличие допустимых символов в отличие от printf, которая только проверяет строку формата на предмет пустого указателя.

Подробнее рассмотрим функцию printf.

Общее описание

В языке C печать символов через стандартный поток вывода осуществляется посредством вызова функции printf. Команда printf в C форматирует набор выводимых данных, и они отправляются в стандартный поток вывода stdout. Значения, переданные в качестве аргументов функции, выводятся в консоль согласно указанной строке форматирования, которая в свою очередь заключает в себе две разновидности элементов. Первая разновидность - это символы, выводимые на экран, а элементы, определяющие особенности формата данных и отвечающие за метод представления аргументов при выводе, относятся ко второму виду.

При выводе переменных с printf в C особые комбинации символов в строке аргументов заменяются на преобразованные в соответствии с этими символами данные, причём для каждого типа данных существуют свои спецификации формата вывода.

Тип функции и возвращаемое значение

Функция printf, имеющая возвращает целочисленную величину, обозначающую количество напечатанных на экране символов. К примеру, можно присвоить:

int k = printf("Привет %c %d %s", "a", 11, "всем!"),

и тогда по значению переменной k легко определяется, возникла ли ошибка при выводе. В случае возврата отрицательного значения (если функция вернула "-1") можно сделать вывод, что произошла ошибка при её выполнении.

Синтаксис и зависимости

Чтобы использовать функцию printf, требуется подключить заголовочный файл "stdio.h" следующим образом:

#include

Шаблон функции выглядит:

int printf(const char *формат, ...)

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

Форма задания спецификаций формата:

%[флаги][ширина][.позиция][длина]тип

Форматирование с printf в C выходных значений

Чтение строки формата, указываемой в круглых скобках после имени вызываемой функции, происходит только в одну сторону: слева направо, и первый аргумент, указанный после самой этой строки, выводится лишь в том случае, если встретилась первая спецификация. До тех пор, пока не кончится строка формата, указанные в ней спецификации будут инициировать преобразование и печать последующих аргументов. В строке формата знак пробела рассматривается, как обычный символ и передаётся на вывод в случаях, когда он не используется в выражении спецификации формата.

Символ "%" указывает на начало спецификации формата вывода, следом за ним идёт код формата. Все поля в спецификации представляют собой отдельные, определяющие условия форматирования числа или символы.

Форматированный вывод printf в C обладает своими особенностями. В случае, если количество перечисленных аргументов превышает число спецификаций формата, они пропускаются и не выводятся. Иначе, если спецификаций формата больше, чем значений в списке подлежащих печати аргументов, результат вызова функции не определяется.

Для явного указания, который по счёту аргумент нужно задействовать, возможно использовать "%m$" вместо "%" и "*m$" вместо "*", причём m, целочисленное десятичное значение, обозначает позицию нужного аргумента (индексирование начинается с единицы).

Параметры

Флаги, используемые в строке формата
Флаг Описание
- Выравнивание результата по левому краю в поле вывода
+ При выводе численного значения, имеющего знак, принудительно печатается "+" перед положительной величиной (по умолчанию выводится только "-" перед отрицательным значением)
0 Для целых чисел и чисел с плавающей запятой ведущие нули используются вместо символов пробела для заполнения левых разрядов в случае, если задана ширина поля, превышающая длину числа. Для целых чисел флаг игнорируется, если явно указана точность. Для других преобразований с использованием этого флага поведение функции не определено. Флаг "0" не учитывается, если присутствует флаг "-"
space Если результат вывода выражения, имеющего знак, не начинается с символа этого знака или пуст, то пробел добавляется к результату. Флаг "space" игнорируется, если присутствует флаг "+"
# Выполняется альтернативная форма преобразования

Различные спецификаторы формата

Спецификатор формата Использование и описание для printf C Тип аргумента
% Запись литерала "%"
c Вывод одного символа. Происходит преобразование аргумента в тип unsigned char. При использовании модификатора "l" аргумент преобразуется в строку символов unsigned char
s Печать строки символов. Аргумент должен являться указателем на начальный элемент массива символов char char *
d
i
Вывод десятичного представления целочисленного значения со знаком int
o Вывод восьмеричного представления без знакового целочисленного значения unsigned int
x
X
Вывод шестнадцатеричного представления без знакового целочисленного значения. Символы "a", "b", "c", "d", "e", "f" применяются для преобразования "x". А для преобразования "X" - "A", "B", "C", "D", "E", "F" unsigned int
u Вывод десятичного преобразования без знакового целочисленного значения. Если преобразованное значение и точность вместе равны 0, то символы не выводятся unsigned int
f
F
Вывод десятичного представления числа с плавающей запятой, имеющего знак double
e
E
Вывод десятичного экспоненциального представления округлённого и преобразованного так, что перед запятой остаётся одна цифра, а количество цифр после запятой соответствует точности представления (по умолчанию точность равна 6, а если указан 0, то символ запятой не выводится вообще). Символ "е" выводится в верхнем или нижнем регистре в зависимости от преобразования double
a
A
Вывод шестнадцатеричного представления числа с плавающей запятой double
g
G
Вывод десятичного представления числа с плавающей запятой или его десятичного экспоненциального представления в зависимости от значения и точности double
n Возврат числа элементов, выведенных функцией printf. Результат записывается в переменную, на которую указывает аргумент. Спецификация может не содержать флагов, ширины поля или точности int *
p Вывод указателя void *

Модификатор ширины поля

В строке формата в printf C может быть записано целое число после знака процента и перед командой форматирования. Оно является модификатором ширины поля и влияет на представление отображаемых данных. Наименьшая ширина поля, предназначенная для значения, определяется этим числом, и присутствие такого модификатора в случае, если аргумент оказывается меньше выделенного ему поля, вызывает добавление к результату пробелов или нулей. Заполнителем по умолчанию служит символ пробела, однако можно установить ноль, прописав его перед спецификацией ширины. Модификатор указывает минимум ширины, и любое превышающее этот минимум значение будет напечатано без помех. Число, к примеру, состоящее менее чем из восьми символов и печатаемое со спецификацией "%08d", окажется дополненным до необходимых восьми знаков нулями.

Подобные модификаторы могут также задавать параметры точности или выравнивания.

Модификатор точности

Модификатор точности служит для определения числа печатаемых десятичных знаков в представлении чисел. Для добавления модификатора точности необходимо поставить точку после спецификации ширины поля и указать нужное значение точности после неё. Модификатор точности определяется для "e", "f", "a", "E", "A" и "F" форматов. Для целых чисел модификатор устанавливает количество отображаемых цифр, добавляя нули в левый разряд, если нужно, а при выводе рациональных чисел определяет необходимое количество знаков после запятой. Применительно к строковым переменным: следующее после точки число в модификаторе точности служит определителем максимальной длины поля при выводе. К примеру, при заданной спецификации формата "%4.8s" будет выведена строка, длина которой находится в диапазоне от четырёх до восьми символов, в случае превышения крайние символы будут опущены.

Другие модификаторы формата

Выравниванием по умолчанию является выравнивание по правому краю, однако это можно изменить, поставив знак "-" после "%". Такая спецификация формата устанавливает выравнивание по левому краю.

Кроме того, функция printf способна различать короткие и длинные типы выводимых целых значений. Допустимые спецификаторы: "о", "d", "u", "i", "x" и "X". Длинный тип значения устанавливается модификатором "l", а короткий - модификатором "h". Например, при выводе длинного целого числа и значения типа short unsigned int спецификации формата выглядят как "%ld" и "%hu" соответственно.

Примеры

1. Описание printf C и результаты вызова каждой функции:

2. Вывод на экран простого диалогового сообщения:

printf("сообщение");

3. Программный код:

Выражения, заданные в перед спецификациями формата, печатаются на экране, также как и следующие за строкой формата аргументы. Результат выполнения приведённых выше функций printf C, описание выходных данных:

Данный пример иллюстрирует вывод на экран при помощи различных форматов строк, целочисленных переменных, символов, а также чисел с плавающей точкой.

Стандартная функция ввода scanf и примеры её использования

Функция scanf используется для чтения вводимых с клавиатуры данных. Описание printf и scanf в C представлено в заголовочном файле "stdio.h".

scanf("format specifiers",&value1,&value2, ...);

Простой пример работы с функцией scanf:

#include

Выводит строку, значение переменной или выражение.
Синтаксис:

Print(string arg)

Функция print() выводит аргумент arg, в качестве которого может быть переменная или выражение.

vsprintf()

Возвращает отформатированную строку (PHP 4 >= 4.1.0, PHP 5)

Описание:

String vsprintf (string format, array args)

Эта функция подобна sprintf(), но она принимает не переменное число аргументов, а массив.

Производит вывод одного или нескольких значений.
Синтаксис:

Echo(string arg1, string ...)

Функция echo() выводит значения перечисленных параметров.
echo() - фактически языковая конструкция, поэтому для нее не обязательны скобки, даже если используется несколько аргументов.
echo "Перенос на следующую строку,имеющийся в коде, сохраняетсяи используется при выводе".
"чтобы избежать этого используйте".
"оператор конкатенации";

Вывод отформатированной строки.
Синтаксис:

Int printf(string format [, mixed args, ...]);

Делает то же самое, что и sprintf(), только результирующая строка не возвращается, а направляется в браузер пользователя.

Производит форматирование строки с подстановкой переменных.
Синтаксис:

Sprintf($format [,args, ...])

Эта функция возвращает строку, составленную на основе строки форматирования, содержащей некоторые специальные символы, которые будут впоследствии заменены на значения соответствующих переменных из списка аргументов.
Строка форматирования $format может включать в себя команды форматирования, предваренные символом %.
Все остальные символы копируются в выходную строку как есть. Каждый спецификатор формата (то есть, символ % и следующие за ним команды) соответствуют одному, и только одному параметру, указанному после параметра $format. Если же нужно поместить в текст % как обычный символ, необходимо его удвоить:

Echo sprintf("The percentage was %d%%",$percentage);

Каждый спецификатор формата включает максимум пять элементов (в порядке их следования после символа %):

Необязательный спецификатор размера поля, который указывает, сколько символов будет отведено под выводимую величину.
В качестве символов-заполнителей (если значение имеет меньший размер, чем размер поля для его вывода)
может использоваться пробел или 0, по умолчанию подставляется пробел. Можно задать любой другой символ-наполнитель, если указать его в строке форматирования, предварив апострофом.
Опциональный спецификатор выравнивания, определяющий, будет результат выровнен по правому или по левому краю поля. По умолчанию производится выравнивание по правому краю, однако можно указать и левое выравнивание, задав символ - (минус).

Необязательное число, определяющее размер поля для вывода величины. Если результат не будет в поле, то он "вылезет" за края этого поля, но не будет усечен.
Необязательное число, которое предварено точкой ".", предписывающее, сколько знаков после запятой будет в результирующей строке.
Этот спецификатор учитывается только в том случае, если происходит вывод числа с плавающей точкой, в противном случае он игнорируется.
Наконец, обязательный (заметьте - единственный обязательный!) спецификатор типа величины, которая будет помещена в выходную строку:

b - очередной аргумент из списка выводится как двоичное целое число
c - выводится символ с указанным в аргументе кодом
d - целое число
f - число с плавающей точкой
o - восьмеричное целое число
s - строка символов
x - шестнадцатиричное целое число с маленькими буквами a-z
X - шестнадцатиричное целое число с большими буквами A-Z

Вот как можно указать точность представления чисел с плавающей точкой:

$money1 = 68.75;
$money2 = 54.35;
$money = $money1 + $money2;
// echo $money выведет "123.1"...
$formatted = sprintf ("%01.2f", $money);
// echo $formatted выведет "123.10"!

Вот пример вывода целого числа, предваренного нужным количеством нулей:

$isodate=sprintf("%04d-%02d-%02d",$year,$month,$day);

Производит интерпретацию строки согласно формату и занесение значений в переменные.

Синтаксис:

Mixed sscanf(string str, string format [, string var1 ...])

Функция sscanf() является противоположностью функции printf().

Она интерпретирует строку str согласно формату format, аналогично спецификации printf().

При указании только двух аргументов полученные значения возвращаются в массиве.

// получение серийного номера$serial = sscanf("SN/235-0001", "SN/%3d-%4d");
echo $serial*10000+$serial; // выводит: 2350001
// и даты изготовления$date = "January 01 2000";
list($month, $day, $year) = sscanf($date, "%s %d %d");
echo "Дата: $year-".substr($month,0,3)."-$dayn";
// выводит: 2000-Jan-01

При указании дополнительных необязательных параметров (их следует передавать по ссылке)

функция возвращает их число. Те переменные, которые не получают значений, в возвращаемом значении не учитываются.

// генерируем XML запись из строки$auth = "765tLewis Carroll";
$n = sscan($auth,"%dt%s %s", &$id, &$first, &$last);
echo "
$first
$last
n";

fprintf()

Описание:

Int fprintf (resource handle, string format [, mixed args])

Записывает строку, созданную с использованием строки формата format, в поток, дескриптор которого передается в handle. Аргумент format подробно рассмотрен в описании функции sprintf().

fprintf(): заполнение нулями


return;

fprintf($fp, "%04d-%02d-%02d", $year, $month, $day);
// запишет форматированную дату в файл date.txt
?>

fprintf(): форматирование денежных величин

if (!($fp = fopen("currency.txt", "w")))
return;

$money1 = 68.75;
$money2 = 54.35;
$money = $money1 + $money2;
// echo $money выведет "123.1";
$len = fprintf($fp, "%01.2f", $money);
// строка "123.10" записана в файл currency.txt

echo "записано $len байт в файл currency.txt";
?>

vfprintf()

Записывает отформатированную строку в поток (PHP 5)

Описание:

Int vfprintf (resource handle, string format, array args)

Записывает строку, отформатированную в соответствии с format, в ресурс потока, указанный дескриптором handle. Форматирование осуществляется аналогично sprintf().

Работает так же, как и fprintf(), но принимает массив аргументов, а не переменное число аргументов.

Возвращает длину выведенной строки.

See also: printf(), sprintf(), sscanf(), fscanf(), vsprintf(), and number_format().
Examples

vfprintf(): zero-padded integers

if (!($fp = fopen("date.txt", "w")))
return;

vfprintf($fp, "%04d-%02d-%02d", array($year, $month, $day));
// will write the formatted ISO date to date.txt
?>

vprintf()

Выводит отформатированную строку (PHP 4 >= 4.1.0, PHP 5)

Описание:

Int vprintf (string format, array args)

Выводит значения массива args, отформатированные в соответствии с аргументом format, описанном в документации функции sprintf().

Эта функция подобна printf(), но она принимает не переменное число аргументов, а массив.

Возвращает длину выведенной строки

number_format()

Форматирует число с разделением групп (PHP 3, PHP 4, PHP 5)

Описание:

String number_format (float number [, int decimals])

string number_format (float number, int decimals, string dec_point, string thousands_sep)

number_format() возвращает отформатированное число number. Функция принимает один, два или четыре аргумента (не три):

Если передан только один аргумент, number будет отформатирован без дробной части, но с запятой (",") между группами цифр по 3.

Если переданы два аргумента, number будет отформатирован с decimals знаками после точки (".") и с запятой (",") между группами цифр по 3.

Если переданы все четыре аргумента, number будет отформатирован с decimals знаками после точки и с разделитилем между группами цифр по 3, при этом в качестве десятичной точки будет использован dec_point, а в качестве разделителя групп - thousands_sep.

Используется только первый символ строки thousands_sep. Например, при передаче foo в качестве thousands_sep для форматирования числа 1000, number_format() возвращает 1f000.

Пример использования number_format()

Во Франции обычно используются 2 знака после запятой (","), и пробел (" ") в качестве разделителя групп. Такое форматирование получается при использовании следующего кода:

$number = 1234.56;

// английский формат (по умолчанию)
$english_format_number = number_format($number);
// 1,234

// французский формат
$nombre_format_francais = number_format($number, 2, ",", " ");
// 1 234,56

$number = 1234.5678;

// английский формат без разделителей групп
$english_format_number = number_format($number, 2, ".", "");
// 1234.57

printf ("как форматировать", парметр1, параметр2, ...) -- выводит результат на экран

$result=sprintf ("..", .., .., ...) - тоже самое, только строка не выводиться, а помещается в $result

Цитата из перевода мануала (ПРИМЕРЫ ниже:-):

sprintf

sprintf -- возвращает форматированную строку
Описание
sprintf (string format, mixed ...);

Возвращает строку, обрабатываемую в соответствии с форматирующей строкой format .

Форматирующая строка, содержащая ноль или более директив: обычные символы (кроме %) которые копируются прямо в результат, и that are copied directly to the result, и описания изменений , каждое из которых выполняет определенные действия. Это применительно и к sprintf() и к printf()

Каждое описание изменений состоит из следующих элементов, в порядке:

    Дополнительный описатель заполнения , который говорит, какие символы будут использоваться для заполнения результата до правильног размера строки. Это могут быть пробелы или 0 (символ нуля). По умолчанию заполняется пробелами. Алтернативный символ заполнения может быть определен одинарной кавычкой ("). См. примеры ниже.

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

    Дополнительный описатель ширины , который говорит, с каким количеством символов (минимум) пожет производится данная замена.

    Дополнительный описатель точности , который говорит, сколько десятичных знаков следует отображать для чисел с плавающей точкой. Этот описатель не действует на остальные типы, кроме double. (другая полезная функция для форматирования чисел это number_format() .)

  1. Описатель типа , который говорит о том, как тип данных аргумента должен трактоваться. Возможные типы:

    % - символ процента. Аргумент не требуется.
    b - аргумент трактуется как integer и представляется как двоичное число.
    c - аргумент трактуется как integer и представляется как символ с ASCII значением.
    d - аргумент трактуется как integer и представляется как десятичное число.
    f - аргумент трактуется как double и представляется как число с плавающей точкой.
    o - аргумент трактуется как integer и представляется как восьмиричное число.
    s - аргумент трактуется и представляется как строка.
    x - аргумент трактуется как integer и представляется как шестнадцатиричное число (с буквами в нижнем регистре).
    X - аргумент трактуется как integer и представляется как шестнадцатиричное число (с буквами в верхнем регистре).
Примеры

Пример 2. sprintf: форматирование денежной еденицы

$money1 = 68.75; $money2 = 54.35; $money = $money1 + $money2; // echo $money will output "123.1"; $formatted = sprintf ("%01.2f", $money); // echo $formatted will output "123.10"

Примеры

Все то, что записано >>> между таких скобок <<< является результатом работы фукнции (т.е. пример вывода на экран) $s="MyString"; -> строка %s $f=12345.6789; -> дробное %f $d=12345; -> целое %d 10-я система: 0123456789 16числа %x 16-я система: 0123456789abcdef 16числа %X 16-я система: 0123456789ABCDEF 8числа %o 8-я система: 01234567 2числа %b 2-я система: 01 просто выводим число: printf("%d",$d); >>> 12345 <<< просто выводим 16число: printf("%X",123456789); >>> 75BCD15 <<< просто выводим 2число: printf("%b",$d); >>> 11000000111001 <<< просто выводим дробное число: printf("%f",$f); >>> 12345.6789 <<< дополнение чисел нулями: printf("%010d",$d); >>> 0000012345 <<< округление до 3х знаков после запятой: printf("%.3f",$f); >>> 12345.679 <<< просто выводим число + посторонний текст: printf("посторонний%dтекст",$d); >>> посторонний12345текст <<< вывод нескольких переменных - последовательное перечисление printf("%d-%f-%s",$d,$f,$s); >>> 12345-12345.678900-MyString <<< выравнивание (ширина 20 символов) по правому краю, пустоту заполняем "_": printf("%"_20s",MyString); >>> ____________MyString <<< выравнивание по левому краю, пустоту заполняем "x": printf("%-"x20s",MyString); >>> MyStringxxxxxxxxxxxx <<<

Другие примеры смотрим тут:

Функция PHP sprintf позволяет преобразовать и разместить некоторое количество аргументов в одной строке символов. Спецификаторы форматирования позволяют работать с символами, строками, целыми и вещественными числами.

Применение функции востребовано для оформления табличной информации и создания шаблонов. Может быть использовано для предварительной формализации исходных данных в определенной структуре, изменения их содержания или последовательности.

Синтаксис функции PHP sprintf()

Результат функции - строка символов, сформированная в определенной последовательности из конкретных данных, параметры функции:

  • строка форматирования;
  • список аргументов.

Для форматирования можно использовать любую конструкцию и логику, включая теги HTML. Хотя нет никаких ограничений на применение sprintf, руководство по PHP определяет спецификаторы преобразования в большей степени к числовой информации.

Элемент формата начинается с символа % и заканчивается символом спецификатора. Большая часть возможностей форматирования лежит в области числовой информации. Очень практична возможность преобразовать число в двоичный и шестнадцатеричный форматы. Здесь функции sprintf на PHP вряд ли стоит писать замену.

В приведенном примере особенно выделено правило именования аргументов и отличия спецификатора x от X. Правильное использование ссылок на последовательность аргументов, которые форматируются, имеет значение для правильного результата. Нумерация всегда начинается с 1.

Последовательность использования ссылок не имеет значения, но важно помнить: PHP функция sprintf все элементы % (без указания номера аргумента) рассматривает последовательно в общем списке. К нумерации общего списка никакого отношения не имеет ни количество, ни последовательность элементов %, указанных с конкретными номерами параметров.

Описание примера применения sprintf в PHP

Если управлять аргументом в виде строки нет прямой возможности, то управлять строкой формата и выводом в строку результата цифровой информации не представляет проблемы.

В первых двух строках примера (вывод аргументов Arg1, Arg2c и Arg2p) первый аргумент - строка (наименование позиции) выводится как есть. Третий аргумент занимает в выводе 12 (14) символов. Первая строка выравнивает число слева нулями до общей длины 12 символов. После точки четыре символа. Вторая строка выравнивает число справа (дробную часть) до 14 символов. Признаком, что нужно выполнять выравнивание справа, служит символ -.

Строка форматирования - это обычная строка символов. В нее можно вставлять вычисляемые выражения. В данном случае для выделения другого числа использованы вставки {$cL} и {$cR}. Это сделало строку форматирования нагляднее и упростило ее запись по всем примерам.

Формирование строки форматирования

Работа PHP на русском, или функция sprintf, - работа интерпретатора в естественной и удобной среде. Собственно, HTML-страница со вставками PHP-кода представляет собой любой контекст на любом языке. Это не та свобода, которую дает язык JavaScript в среде браузера.

Чтобы вывести русский контент на PHP, не нужно кодировать кириллицу, но иногда приходится использовать функцию преобразования iconv(). В любом случае все доступно и читабельно.

Текст вставки PHP-кода в HTML-страницу понятен и востребован. Применение в строке символов:

Значение переменной ABC={$ABC} единиц

Вставка {$ABC} имеет значение только один раз и выполняется тоже только один раз.

Особенность выполнения PHP-кода на странице

Интерпретатор только один раз просматривает страницу и только один раз заменяет вставки {$ABC} их значениями. Программист может, по своему усмотрению, применять фразу "только один раз", заставляя PHP многократно приближаться к нужному результату.

В любом случае, как только HTML-страница отправлена в браузер, в ней нет никакого PHP-кода.

Если элемент страницы из браузера инициировал контакт с сервером, он может запустить новый PHP-скрипт. Здесь вставки {$ABC} весьма относительны, и нет никакой гарантии правильного результата. Но применение в PHP sprintf - это динамика такой возможности.

Разработчик может не только получить желаемое исполнение такой вставки, но и изменить строку, в которую она будет передавать нужное значение.

Момент формирования контента

Использование потенциала PHP как средства формирования вставок в HTML-страницу, как инструмента формирования страницы целиком - естественно. С этого начинается сайт. Как только страница сформирована, а фактически на сайт пришел посетитель, то по современным представлениям:

  • страницу менять нельзя;
  • пользователя упускать тоже нельзя.

Фактически посетитель пришел на сайт и получил первый ответ в виде HTML-кода. Совершенно неправильно менять этот ответ - это означает сказать посетителю, что страница его меняет. Но реагировать на действия посетителя адекватно и по его инициативе страница обязана.

Приход посетителя - первый ответ. Действие посетителя - адекватная реакция страницы и ее подготовка ко всем предполагаемым следующим действиям посетителя.

Значительная доля ответственности за динамику страницы по инициативе посетителя ложится на JavaScript, но он функционирует только в браузере, а на сервер может отправлять только AJAX-запросы. Каждое обращение к серверу может запускать PHP-скрипт. Но момент формирования страницы и момент реакции на запрос существенно различаются.

Функция PHP sprintf - идеальное средство для динамического формирования шаблона ответа и заполнения его нужным значением.

Изменение PHP-кода в ходе исполнения

Идея динамики кода родилась вместе с первым языком программирования и сегодня присутствует в каждом современном языке программирования.

Выполнение кода посредством eval (строка кода) сегодня считается брешью в безопасности, но она настолько же востребована, насколько и опасна.

Чтобы изменить код в процессе исполнения, сегодня не обязательно пользоваться функцией eval(). Это скорее быстрый завтрак, выполнение одной-двух команд, нежели практичный фундамент для построения нужной динамики.

Функция PHP sprintf() позволяет проектировать шаблон скрипта, например кода объекта, который будет вызван при том или ином действии посетителя. Сложившаяся практика записывать тела объектов в виде независимых файлов - идеальное решение для их изменения в процессе работы сайта.

Использование инструментов дополняющих функциональность sprintf() позволяет не только изменять используемые объекты в результате действий конкретного посетителя, но и переносить эту динамику на работу с другими посетителями: это развитие сайта, динамика его функциональности, накопление опыта работы и знаний.

string sprintf (string format [, mixed args])

Возвращает строку, созданную с использованием строки формата format .

Строка формата состоит из директив: обычных символов (за исключением %), которые копируются в результирующую строку, и описатели преобразований , каждый из которых заменяется на один из параметров. Это относится также к fprintf() , sprintf() и printf() .

Каждый описатель прреобразований состоит из знака процента (%), за которым следует один или более дополнительных элементов (в том порядке, в котором они здесь перечислены):

    Необязательный описатель заполнения , который определяет, какой символ будет использоваться для дополнения результата до необходимой длины. Это может быть пробел или 0 . По умолчанию используется пробел. Альтернативный символ может быть указан с помощью " . См. примеры ниже.

    Необязательный описатель выравнивания , определяющий выранивание влево или вправо. По умолчанию выравнивается вправо, - используется для выравнивания влево.

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

    Необязательный описатель точности , определяющий, сколько десятичных разрядов отображать для чисел с плавающей точкой. Имеет смысл только для числовых данных типа float . (Для форматирования чисел удобно также использовать функцию number_format() .)

  1. Описатель типа , определяющий, как трактовать тип данных аргумента. Допустимые типы:

    % - символ процента. Аргумент не используется.
    b - аргумент трактуется как целое и выводится в виде двоичного числа.
    c - аргумент трактуется как целое и выводится в виде символа с соответствующим кодом ASCII.
    d - аргумент трактуется как целое и выводится в виде десятичного числа со знаком.
    e - аргумент трактуется как float и выводится в научной нотации (например 1.2e+2).
    u - аргумент трактуется как целое и выводится в виде десятичного числа без знака.
    f - аргумент трактуется как float и выводится в виде десятичного числа с плавающей точкой.
    o - аргумент трактуется как целое и выводится в виде восьмеричного числа.
    s - аргумент трактуется как строка.
    x - аргумент трактуется как целое и выводится в виде шестнадцатиричного числа (в нижнем регистре букв).
    X - аргумент трактуется как целое и выводится в виде шестнадцатиричного числа (в верхнем регистре букв).

Начиная с PHP 4.0.6 в строке формата поддерживается нумерация и изменение порядка параметров. Например:


Этот код выведет "There are 5 monkeys in the tree". Теперь представьте, что строка формата содержится в отдельном файле, который потом будет переведен на другой язык, и мы переписываем ее в таком виде:

Пример 2. Изменение порядка параметров

$format = "The %s contains %d monkeys" ;

?>
Появляется проблема: порядок описателей преобразования не соответствует порядку аргументов. Мы не хотим менять код, и нам нужно указать, какому аргументу соответствует тот или иной описатель преобразования.

Пример 3. Изменение порядка параметров

$format = "The %2\$s contains %1\$d monkeys" ;
printf ($format , $num , $location );
?>
Нумерация аргументов имеет еще одно применение: она позволят вывести один и тот же аргумент несколько раз без передачи функции дополнительных параметров.

© 2024 dhmoscow.ru - Компьютер надо изучать