Перейти к содержимому
Теория · Строки · урок 6 из 9

Форматирование: sprintf и number_format

В первом уроке темы двойные кавычки были бланком с пропусками. У настоящих бланков пропуски бывают с правилами: «сумма — два знака после запятой», «номер заказа — три цифры». Такие правила для чисел задают функции форматирования.

Зачем они нужны, видно на цене. Разделим 10 на 3:

PHP
<?php

$price = 10 / 3;
echo $price, "\n"; // 3.3333333333333
echo sprintf('%.2f', $price), "\n"; // 3.33
printf("%s: %d pcs, %.2f each\n", 'pen', 3, $price);
// pen: 3 pcs, 3.33 each

echo печатает дробное число с точностью до 14 значащих цифр: одна тройка до точки и 13 после. Для цены это слишком много, и sprintf оставляет два знака после точки.

sprintf: шаблон с пропусками

sprintf принимает шаблон и значения для него, а возвращает готовую строку. Каждый знак % в шаблоне начинает пропуск — спецификатор. Буква в его конце говорит, какое значение туда вписать.

%s — строка

Вписывает значение как текст. В примере %s получил 'pen'.

%d — целое число

Вписывает число без дробной части. Дробная часть отбрасывается, а не округляется: sprintf('%d', 9.99) даёт 9.

%.2f — дробное число

Вписывает число с двумя знаками после точки и округляет: 3.333… становится 3.33. Цифра после точки задаёт, сколько знаков оставить.

Ширина и нули

Перед точкой можно указать ширину — сколько символов займёт число целиком, вместе с точкой:

PHP
echo sprintf('%05.2f', 3.14159), "\n"; // 03.14

Разберём %05.2f по частям:

  1. 0 — пустые места заполняются нулями, а не пробелами.
  2. 5 — число займёт не меньше пяти символов.
  3. .2 — два знака после точки.
  4. f — дробное число.

Число 3.14 занимает четыре символа, и sprintf дописывает слева один ноль.

Значения подставляются по порядку: первое — в первый пропуск, второе — во второй. printf работает так же, но не возвращает строку, а сразу печатает её.

Здесь бланк перестаёт быть точной картинкой. В настоящий бланк вписывают ровно то, что написали, а sprintf сам меняет значение под пропуск: %d отрезает дробную часть, %.2f округляет.

number_format и str_pad

Две функции готовят число к показу человеку.

number_format

number_format расставляет разряды и знаки после запятой. Её аргументы по порядку:

  1. число;
  2. сколько знаков после запятой;
  3. чем отделять дробную часть;
  4. чем отделять разряды.

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

str_pad

str_pad дополняет строку до нужной длины: номер 7 превращается в 007. Без STR_PAD_LEFT символы дописываются справа.

PHP
echo number_format(1234567.891), "\n"; // 1,234,568
echo number_format(1234567.891, 2, ',', ' '), "\n"; // 1 234 567,89
echo str_pad('7', 3, '0', STR_PAD_LEFT), "\n"; // 007
echo str_pad('ab', 5, '.'), "|\n"; // ab...|

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

Частая ошибка

Число отформатировали, а потом продолжили с ним считать:

PHP
$sum = number_format(1234.5, 2);
echo $sum + 1, "\n"; // ✗
TEXT
Warning: A non-numeric value encountered

number_format вернула строку '1,234.50'. Запятая для PHP — не часть числа: он берёт только 1 в начале строки, выдаёт предупреждение и печатает 2. Считать нужно с числами, а форматировать — в самом конце, перед выводом: number_format(1234.5 + 1, 2) даёт 1,235.50.

Главное

  • echo печатает дробное число до 14 значащих цифр, поэтому цены и суммы перед выводом форматируют.
  • sprintf вписывает значения в шаблон: %s — строку, %d — целое, %.2f — два знака после точки; printf сразу печатает результат.
  • number_format расставляет разряды и знаки после запятой, а str_pad дополняет строку до нужной длины.
  • Результат форматирования — строка: считают с числами, а форматируют перед выводом.