Be careful:
printf ("(9.95 * 100) = %d \n", (9.95 * 100));
'994'
First %d converts a float to an int by truncation.
Second floats are notorious for tiny little rounding errors.(PHP 4, PHP 5, PHP 7, PHP 8)
printf — Выводит отформатированную строку
Выводит строку, отформатированную в соответствии с аргументом
format.
format
Строка формата состоит из нуля или более директив:
обычные символы (за исключением %), которые
просто выводятся без изменения,
и спецификаторы преобразования, каждый из которых
требует передачи своего параметра.
Спецификатор преобразования соответствует прототипу:
%[argnum$][flags][width][.precision]specifier.
Целое число, за которым следует знак доллара $,
чтобы указать, какой числовой аргумент обрабатывать при преобразовании.
| Флаг | Описание |
|---|---|
- |
Выравнивание по левому краю в пределах заданной ширины поля; По умолчанию выравнивание происходит по правому краю. |
+ |
Печатает плюс + у не отрицательных чисел;
По умолчанию знак печатается только у отрицательных чисел.
|
(пробел) |
Дополняет результат пробелами. Это поведение по умолчанию. |
0 |
Дополняет числа нулями (только слева).
Со спецификатором s также может
дополнять нулями справа.
|
'(символ) |
Дополняет результат символом (символ). |
Либо целое число, которое указывает, сколько символов (минимум) должно получиться в результате преобразования,
либо *.
Если указали символ *, ширина задаётся как дополнительное целое значение,
которое предшествует значению, которое отформатировал спецификатор.
Точка ., за которой необязательно следует целое число
или символ *, значение которых зависит от спецификатора:
e, E,
f и F:
задаёт количество цифр после десятичной запятой (значение по умолчанию равно 6).
g,G,
h и H:
задаёт максимальное значение печатаемых значащих цифр.
s: задаёт ограничение
максимального количества символов в строке, которые выведет функция.
Замечание: Если указали точку без последующего значения точности, точность будет считаться за 0. Если указали символ
*, точность задаётся как дополнительное целое значение, которое предшествует значению, которое отформатировал спецификатор.
| Спецификатор | Описание |
|---|---|
% |
Символ процента. Аргументы не требуются. |
b |
Аргумент рассматривается как целое число и печатается в бинарном представлении. |
c |
Аргумент рассматривается как целое число и печатается как символ из таблицы ASCII с соответствующим кодом. |
d |
Аргумент рассматривается как целое число и печатается как целое число со знаком. |
e |
Аргумент считается за число в научной нотации (т. е. 1.2e+2). |
E |
Аргумент аналогичен спецификатору e,
но с заглавным символом (т. е. 1.2E+2).
|
f |
Аргумент считается за число с плавающей точкой (с учётом локали). |
F |
Аргумент считается за число с плавающей точкой (без учёта локали). |
g |
Общий формат. Пусть P равно точности, если точность не равна нулю, 6, если точность не задали, или 1, если точность равна 0. Тогда, если преобразование со стилем «E» будет иметь показатель степени X: Если P > X ≥ −4, преобразование будет в стиле «f» и точность будет P - (X + 1). Иначе преобразование будет в стиле «e» и точность будет P - 1. |
G |
Аргумент аналогичен спецификатору g, но использует
спецификаторы E и f.
|
h |
Аргумент аналогичен спецификатору g, но использует
спецификатор F.
Доступен с PHP 8.0.0.
|
H |
Аргумент аналогичен спецификатору g, но использует
спецификаторы E и F.
Доступен с PHP 8.0.0.
|
o |
Аргумент рассматривается как целое число и печатается в восьмеричном представлении. |
s |
Аргумент рассматривается и печатается как строка. |
u |
Аргумент рассматривается как целое число и печатается как беззнаковое целое число. |
x |
Аргумент рассматривается как целое число и печатается в шестнадцатеричном представлении (буквы будут в нижнем регистре). |
X |
Аргумент рассматривается как целое число и печатается в шестнадцатеричном представлении (буквы будут в верхнем регистре). |
Спецификатор c игнорирует спецификаторы преобразования дополнения и ширины.
Попытка использовать комбинацию спецификаторов строки и ширины с кодировками, которые требуют больше одного байта на символ, иногда даёт неожиданные результаты.
Функция приведёт переменные к типу, который соответствует спецификатору:
| Тип | Спецификатор |
|---|---|
| string | s |
| int |
d,
u,
c,
o,
x,
X,
b
|
| float |
e,
E,
f,
F,
g,
G,
h,
H
|
values
Возвращает длину выводимой строки.
Начиная с PHP 8.0.0, если количество аргументов равно нулю, выбрасывается исключение ValueError.
До PHP 8.0.0 вместо этого выдавалась ошибка уровня E_WARNING.
Начиная с PHP 8.0.0, если [width] меньше нуля или больше PHP_INT_MAX,
выбрасывается исключение ValueError.
До PHP 8.0.0 вместо этого выдавалась ошибка уровня E_WARNING.
Начиная с PHP 8.0.0, если [precision] меньше нуля или больше PHP_INT_MAX,
выбрасывается исключение ValueError.
До PHP 8.0.0 вместо этого выдавалась ошибка уровня E_WARNING.
Начиная с PHP 8.0.0, если аргументов задано меньше, чем требуется, выбрасывается исключение ArgumentCountError.
До PHP 8.0.0 вместо этого выдавалась ошибка уровня E_WARNING.
| Версия | Описание |
|---|---|
| 8.0.0 |
Функция больше не возвращает false, если возникла ошибка.
|
| 8.0.0 |
Выбрасывает исключение ValueError, если количество аргументов равно нулю;
раньше функция выдавала ошибку уровня E_WARNING.
|
| 8.0.0 |
Выбрасывает исключение ValueError, если [width]
меньше нуля или больше PHP_INT_MAX;
раньше функция выдавала ошибку уровня E_WARNING.
|
| 8.0.0 |
Выбрасывает исключение ValueError, если [precision]
меньше нуля или больше PHP_INT_MAX;
раньше функция выдавала ошибку уровня E_WARNING.
|
| 8.0.0 |
Выбрасывает исключение ArgumentCountError, если аргументов задано меньше, чем требуется;
раньше функция выдавала ошибку уровня E_WARNING.
|
Пример #1 printf(): различные примеры
<?php
$n = 43951789;
$u = -43951789;
$c = 65; // ASCII 65 is 'A'
// двойной %% печатает единичный символ '%'
printf("%%b = '%b'\n", $n); // бинарное представление
printf("%%c = '%c'\n", $c); // печатает символ ascii, аналогично функции chr()
printf("%%d = '%d'\n", $n); // целочисленное представление
printf("%%e = '%e'\n", $n); // научная нотация
printf("%%u = '%u'\n", $n); // положительное целое в беззнаковом представлении
printf("%%u = '%u'\n", $u); // отрицательное целое в беззнаковом представлении
printf("%%f = '%f'\n", $n); // представление в виде числа с плавающей точкой
printf("%%o = '%o'\n", $n); // восмеричное представление
printf("%%s = '%s'\n", $n); // строковое представление
printf("%%x = '%x'\n", $n); // шеснадцатеричное представление в нижнем регистре
printf("%%X = '%X'\n", $n); // шеснадцатеричное представление в верхнем регистре
printf("%%+d = '%+d'\n", $n); // знак у положительного целого
printf("%%+d = '%+d'\n", $u); // знак у отрицательного целого
?>Результат выполнения приведённого примера:
%b = '10100111101010011010101101' %c = 'A' %d = '43951789' %e = '4.39518e+7' %u = '43951789' %u = '4251015507' %f = '43951789.000000' %o = '247523255' %s = '43951789' %x = '29ea6ad' %X = '29EA6AD' %+d = '+43951789' %+d = '-43951789'
Пример #2 printf(): спецификаторы строки
<?php
$s = 'monkey';
$t = 'many monkeys';
printf("[%s]\n", $s); // стандартный вывод
printf("[%10s]\n", $s); // выравнивание вправо с пробелами
printf("[%-10s]\n", $s); // выравнивание влево с пробелами
printf("[%010s]\n", $s); // строка дополняется нулями слева
printf("[%'#10s]\n", $s); // строка дополняется пользовательским символом '#'
printf("[%'#*s]\n", 10, $s); // укажите ширину отступа в качестве дополнительного аргумента
printf("[%10.9s]\n", $t); // выравнивание вправо с отсечкой в 9 символов
printf("[%-10.9s]\n", $t); // выравнивание влево с отсечкой в 9 символов
?>Результат выполнения приведённого примера:
[monkey] [ monkey] [monkey ] [0000monkey] [####monkey] [####monkey] [ many monk] [many monk ]
Be careful:
printf ("(9.95 * 100) = %d \n", (9.95 * 100));
'994'
First %d converts a float to an int by truncation.
Second floats are notorious for tiny little rounding errors.[Editor's Note: Or just use vprintf...]
If you want to do something like <?php printf('There is a difference between %s and %s', array('good', 'evil')); ?> (this doesn't work) instead of <?php printf('There is a difference between %s and %s', 'good', 'evil'); ?> you can use this function:
<?php
function printf_array($format, $arr)
{
return call_user_func_array('printf', array_merge((array)$format, $arr));
}
?>
Use it the following way:
<?php
$goodevil = array('good', 'evil');
printf_array('There is a difference between %s and %s', $goodevil);
?>
and it will print:
There is a difference between good and evilYou can use this function to format the decimal places in a number:
$num = 2.12;
printf("%.1f",$num);
prints:
2.1
see also: number_format()A few things to note about printf:1. The definition of specifier g (or G) is often wrongly stated as being "use e or f (or E or f), whichever results in the shorter string". The correct rule is given in the documentation and it does not always give this result. 2. For g/G/h/H, trailing zeros after the decimal point are removed (but not a zero just after the decimal point, in the e/E style).3. g/G are locale-aware whether the e/E or f style is produced.4. For b/o/x/X/u (that is, all integer styles except d) the result shown for negative values is the twos complement form of the number, 2**32 + v, where v is the (negative) value.