Menu

PHP sprintf(): форматирование строк, нули и знаки

sprintf() собирает строку из формата и значений: sprintf('%05.2f', 3.14159) возвращает "03.14". %s, %d и %f, дополнение нулями, фиксированное число знаков после запятой, выравнивание, нумерация аргументов, printf и vsprintf.

На этой странице есть исполняемые редакторы: меняйте, запускайте и сразу видите результат.

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
%ffloat, по умолчанию 6 знаков после запятойsprintf('%f', 1.5)1.500000
%.2ffloat, 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.

Иллюстрация языков программирования Coddy

Учитесь программировать с Coddy

НАЧАТЬ