Форматирование: sprintf и number_format
В первом уроке темы двойные кавычки были бланком с пропусками. У настоящих бланков пропуски бывают с правилами: «сумма — два знака после запятой», «номер заказа — три цифры». Такие правила для чисел задают функции форматирования.
Зачем они нужны, видно на цене. Разделим 10 на 3:
<?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 eachecho печатает дробное число с точностью до 14 значащих цифр: одна тройка до точки и 13 после. Для цены это слишком много, и sprintf оставляет два знака после точки.
sprintf: шаблон с пропусками
sprintf принимает шаблон и значения для него, а возвращает готовую строку. Каждый знак % в шаблоне начинает пропуск — спецификатор. Буква в его конце говорит, какое значение туда вписать.
%s — строка
Вписывает значение как текст. В примере %s получил 'pen'.
%d — целое число
Вписывает число без дробной части. Дробная часть отбрасывается, а не округляется: sprintf('%d', 9.99) даёт 9.
%.2f — дробное число
Вписывает число с двумя знаками после точки и округляет: 3.333… становится 3.33. Цифра после точки задаёт, сколько знаков оставить.
Ширина и нули
Перед точкой можно указать ширину — сколько символов займёт число целиком, вместе с точкой:
echo sprintf('%05.2f', 3.14159), "\n"; // 03.14Разберём %05.2f по частям:
0— пустые места заполняются нулями, а не пробелами.5— число займёт не меньше пяти символов..2— два знака после точки.f— дробное число.
Число 3.14 занимает четыре символа, и sprintf дописывает слева один ноль.
Значения подставляются по порядку: первое — в первый пропуск, второе — во второй. printf работает так же, но не возвращает строку, а сразу печатает её.
Здесь бланк перестаёт быть точной картинкой. В настоящий бланк вписывают ровно то, что написали, а sprintf сам меняет значение под пропуск: %d отрезает дробную часть, %.2f округляет.
number_format и str_pad
Две функции готовят число к показу человеку.
number_format
number_format расставляет разряды и знаки после запятой. Её аргументы по порядку:
- число;
- сколько знаков после запятой;
- чем отделять дробную часть;
- чем отделять разряды.
Если передать только число, она округляет до целого и ставит запятые между разрядами, как принято в английском тексте.
str_pad
str_pad дополняет строку до нужной длины: номер 7 превращается в 007. Без STR_PAD_LEFT символы дописываются справа.
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...|Вторая строка — запись, привычная русскому читателю: пробел между разрядами и запятая перед копейками.
Частая ошибка
Число отформатировали, а потом продолжили с ним считать:
$sum = number_format(1234.5, 2);
echo $sum + 1, "\n"; // ✗Warning: A non-numeric value encounterednumber_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дополняет строку до нужной длины.- Результат форматирования — строка: считают с числами, а форматируют перед выводом.