PHP 8.4.0 RC4 available for testing

printf

(PHP 4, PHP 5, PHP 7, PHP 8)

printfВыводит отформатированную строку

Описание

printf(string $format, mixed ...$values): int

Выводит строку, отформатированную в соответствии с аргументом format.

Список параметров

format

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

Спецификатор преобразования соответствует прототипу: %[argnum$][flags][width][.precision]specifier.

Argnum

Целое число, за которым следует знак доллара $, чтобы указать, какой числовой аргумент обрабатывать при преобразовании.

Флаги
Флаг Описание
- Выравнивание по левому краю в пределах заданной ширины поля; По умолчанию выравнивание происходит по правому краю.
+ Печатает плюс + у не отрицательных чисел; По умолчанию знак печатается только у отрицательных чисел.
(пробел) Дополняет результат пробелами. Это поведение по умолчанию.
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 ]

Смотрите также

  • print - Выводит строку
  • sprintf() - Возвращает отформатированную строку
  • fprintf() - Записывает отформатированную строку в поток
  • vprintf() - Выводит отформатированную строку
  • vsprintf() - Возвращает отформатированную строку
  • vfprintf() - Записывает отформатированную строку в поток
  • sscanf() - Разбирает строку по условиям формата
  • fscanf() - Обрабатывает данные из файла по условиям формата
  • number_format() - Форматирует число с группировкой классов многозначного числа
  • date() - Форматирует метку времени эпохи Unix
  • flush() - Сбрасывает системный буфер вывода

Добавить

Примечания пользователей 7 notes

up
21
dhosek at excite dot com
24 years ago
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.
up
7
php at mole dot gnubb dot net
19 years ago
[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 evil
up
1
simon dot patrick at cantab dot net
2 months ago
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.
up
0
Mario M. Junior
2 years ago
To provide a more user-friendly interface, you can use colors when printing text in the terminal.

p('Ordinary text.');
p('Warning: Check this out...', 'info');
p('Ops! Something went wrong.', 'error');
p('Yeah... done!', 'success');

function p($text, $style = '', $newLine = true) {

$styles = array(
'success' => "\033[0;32m%s\033[0m",
'error' => "\033[31;31m%s\033[0m",
'info' => "\033[33;33m%s\033[0m",

'Black' => "\033[0;30m%s\033[0m",
'Red' => "\033[0;31m%s\033[0m",
'Green' => "\033[0;32m%s\033[0m",
'Yellow' => "\033[0;33m%s\033[0m",
'Blue' => "\033[0;34m%s\033[0m",
'Purple' => "\033[0;35m%s\033[0m",
'Cyan' => "\033[0;36m%s\033[0m",
'Gray' => "\033[0;37m%s\033[0m",
'Graphite' => "\033[1;30m%s\033[0m",

'Bold Red' => "\033[1;31m%s\033[0m",
'Bold Green' => "\033[1;32m%s\033[0m",
'Bold Yellow' => "\033[1;33m%s\033[0m",
'Bold Blue' => "\033[1;34m%s\033[0m",
'Bold Purple' => "\033[1;35m%s\033[0m",
'Bold Cyan' => "\033[1;36m%s\033[0m",
'Bold White' => "\033[1;37m%s\033[0m",

'Bg Black' => "\033[40;1;37m%s\033[0m",
'Bg Red' => "\033[41;1;37m%s\033[0m",
'Bg Green' => "\033[42;1;37m%s\033[0m",
'Bg Yellow' => "\033[43;1;37m%s\033[0m",
'Bg Blue' => "\033[44;1;37m%s\033[0m",
'Bg Purple' => "\033[45;1;37m%s\033[0m",
'Bg Cyan' => "\033[46;1;37m%s\033[0m",
'Bg Gray' => "\033[47;1;37m%s\033[0m",

'Underscore' => "\033[4;37m%s\033[0m",
'Inverted' => "\033[7;37m%s\033[0m",
'Blink' => "\033[5;37m%s\033[0m",
);

$format = '%s';

if (isset($styles[$style])) {
$format = $styles[$style];
}

if ($newLine) {
$format .= PHP_EOL;
}

printf($format, $text);
}
up
0
maybird99 at yahoo dot com
22 years ago
instead of writing a function to round off a float (let's call it 'x') accurately, it's much easier to add a small number to x and then truncate it...
For example: if you want to round off to the nearest integer, just add 0.5 to x and then truncate it. if x=12.6, then it would calculate 13.1, and truncate it to 13. If x=14.4, it would calculate 14.9 and truncate it to 14.
up
0
deekayen at hotmail dot com
23 years ago
You 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()
up
-4
steve at myschoolsystems dot com
3 years ago
To format a dollar value as in $123.00 that may otherwise look like $123 use this

print ('$'); // the dollar sign in front of our answer
printf ('%.2f',$price);
To Top