sprintf() возвращает строку, собранную из формата и списка значений: каждый плейсхолдер % в формате заменяется следующим значением. sprintf('%s is %d years old', 'Ada', 36) возвращает "Ada is 36 years old". printf() принимает те же аргументы, но печатает результат, а не возвращает его.
Плейсхолдеры заполняются по порядку, слева направо. %.2f всегда показывает два знака после запятой (4.50, а не 4.5), а %05d дополняет число нулями до пяти цифр.
Спецификаторы формата
Плейсхолдер это %, необязательные модификаторы и одна буква типа:
| Спецификатор | Значение | sprintf(...) | Результат |
|---|---|---|---|
%s | строка | sprintf('%s', 'PHP') | PHP |
%d | целое число (со знаком) | sprintf('%d', 42.9) | 42 |
%f | float, по умолчанию 6 знаков после запятой | sprintf('%f', 1.5) | 1.500000 |
%.2f | float, 2 знака после запятой | sprintf('%.2f', 1.5) | 1.50 |
%e | экспоненциальная запись | sprintf('%e', 1234.5678) | 1.234568e+3 |
%x / %X | шестнадцатеричное | sprintf('%x', 255) | ff |
%o | восьмеричное | sprintf('%o', 8) | 10 |
%b | двоичное | sprintf('%b', 5) | 101 |
%c | символ по коду | sprintf('%c', 65) | A |
%u | целое без знака | sprintf('%u', 3) | 3 |
%% | сам знак процента | sprintf('%d%%', 50) | 50% |
Измените значения ниже и запустите снова:
%d отбрасывает дробную часть float в сторону нуля, поэтому 42.9 превращается в 42. Если нужно 43, сначала округлите: sprintf('%d', round(42.9)). Строка, которая не является числом, например 'abc', под %d становится 0.
Дополнение ведущими нулями
Между % и буквой можно поставить символ дополнения и ширину. %05d означает "дополнить символом 0 до ширины 5". Это обычный способ форматировать номера заказов, ID счетов, время и даты.
Ширина это минимум. Число длиннее ширины выводится целиком.
%05.2f: ширина и знаки после запятой вместе
У float ширина учитывает каждый символ результата, включая десятичную точку и знак минус. Поэтому %05.2f для 3.14159 даёт 03.14: всего пять символов, два из них после точки.
%f использует десятичный разделитель текущей локали (задаётся через setlocale()), а %F всегда ставит точку. Если ваш код устанавливает локаль, а для JSON, CSV или API нужна точка, используйте %F.
Выравнивание текста по столбцам
Положительная ширина выравнивает по правому краю, - перед шириной выравнивает по левому, а ' с символом после него задаёт свой символ дополнения. Вместе они выстраивают текстовые отчёты и чеки.
%-14s дополняет название товара справа до 14 символов, %8.2f выравнивает цену по правому краю в 8 символах, а %'-27s с пустой строкой печатает линию из 27 дефисов. %'*10s дополняет символом * вместо пробелов.
Нумерация аргументов для повтора и перестановки
%1$s означает "первый аргумент как строка", %2$d "второй как целое число". Пронумерованные плейсхолдеры позволяют использовать значение дважды или поменять порядок, не меняя список аргументов, а это нужно переводчикам, когда порядок слов в языках разный.
vsprintf, printf и возвращаемые значения
vsprintf() принимает значения одним массивом, что удобно, когда они уже лежат в массиве. printf() возвращает число выведенных байтов, а vprintf() это версия printf() для массива.
Счёт от printf() включает перенос строки, поэтому "Hello\n" это 6 байтов. Для многобайтового текста считаются байты, а не символы.
Слишком мало аргументов вызывает ошибку
Начиная с PHP 8 формат, в котором плейсхолдеров больше, чем значений, выбрасывает ArgumentCountError, а не возвращает false. Увидев эту ошибку, посчитайте плейсхолдеры % (не учитывая %%).
Сообщение считает и строку формата аргументом: ArgumentCountError: 4 arguments are required, 3 given. Лишние аргументы молча игнорируются, поэтому обратная ошибка никак не проявляется. Если результат sprintf выглядит неправильно, выведите формат рядом со значениями. Когда нужен только разделитель тысяч, number_format() проще, чем собирать его через sprintf. Полный список модификаторов есть на php.net.
Часто задаваемые вопросы
Как добавить ведущие нули к числу в PHP?
Используйте sprintf('%05d', 42), она возвращает "00042". 0 это символ дополнения, а 5 общая ширина. Для строки тот же результат даёт str_pad('42', 5, '0', STR_PAD_LEFT).
Как отформатировать число с 2 знаками после запятой через sprintf?
Используйте %.2f: sprintf('%.2f', 3.14159) возвращает "3.14", а sprintf('%.2f', 5) возвращает "5.00". Добавьте ширину, чтобы ещё и дополнить число: %08.2f даёт "00003.14".
Чем printf отличается от sprintf в PHP?
sprintf() возвращает отформатированную строку, чтобы её можно было сохранить. printf() сразу её печатает и возвращает число выведенных байтов. echo sprintf(...) и printf(...) дают одинаковый вывод.
Что означает %s в PHP?
%s это плейсхолдер для строки в sprintf() и printf(): sprintf('Hello, %s', 'Ada') возвращает "Hello, Ada". Числа, переданные в %s, приводятся к строкам. %d предназначен для целых чисел, а %f для float.
Как использовать один аргумент дважды в sprintf?
Пронумеруйте плейсхолдеры: sprintf('%1$s loves %2$s, and %2$s loves %1$s', 'Ada', 'PHP'). Заключайте формат в одинарные кавычки: внутри двойных PHP читает $s как переменную, и "%1$s" превращается в %1 и значение $s.