Avatar ·

Как вывести число с двумя знаками после запятой в PHP?

Всем привет! Я только начал изучать PHP и столкнулся с такой проблемой. Мне нужно выводить цены товаров на сайте, чтобы они всегда отображались с двумя знаками после запятой. Например, если цена 10, то должно быть 10.00, если 5.5 — должно быть 5.50, а если 3.456 — должно быть 3.46. Я пробовал использовать просто round(), но он работает не так, как мне нужно. Вот мой код: ```php $price1 = 10; $price2 = 5.5; $price3 = 3.456; echo round($price1, 2); // выводит 10, а нужно 10.00 echo round($price2, 2); // выводит 5.5, а нужно 5.50 echo round($price3, 2); // выводит 3.46, это правильно ``` Проблема в том, что round() просто отбрасывает лишние знаки, но не добавляет нули, если их не хватает. А мне нужно, чтобы число всегда было строго вида "X.XX", даже если это целое число. Я читал про функцию number_format(), но в документации написано много параметров, и я запутался. Подскажите, как правильно это сделать? Нужно, чтобы решение работало и для целых чисел, и для чисел с плавающей точкой, и для отрицательных чисел тоже (мало ли). Заранее спасибо! <<>>

Использование number_format() — правильный путь

Ваша проблема решается функцией number_format(). Она специально создана для форматирования чисел с заданным количеством десятичных знаков, разделителем тысяч и десятичным разделителем. В вашем случае достаточно передать два аргумента: само число и количество знаков после запятой.

<?php
$price1 = 10;
$price2 = 5.5;
$price3 = 3.456;
$price4 = -2.1;

echo number_format($price1, 2) . "\n";  // 10.00
echo number_format($price2, 2) . "\n";  // 5.50
echo number_format($price3, 2) . "\n";  // 3.46
echo number_format($price4, 2) . "\n";  // -2.10
?>

Функция number_format() делает три вещи автоматически:

  • Округляет число до указанного количества знаков (в вашем случае 2).
  • Добавляет нули, если после округления не хватает знаков (10 → 10.00).
  • Использует точку как десятичный разделитель по умолчанию.

Если вам нужно изменить десятичный разделитель на запятую (например, для европейского формата), можно передать третий и четвёртый параметры:

<?php
$price = 1234.56;
echo number_format($price, 2, ',', ' ');  // 1 234,56
?>

Здесь третий параметр ',' — это десятичный разделитель, а четвёртый ' ' — разделитель тысяч. По умолчанию они равны точке и запятой соответственно.

Важные нюансы

  • Тип результата: number_format() возвращает строку, а не число. Это логично, потому что "10.00" — это строковое представление, а не числовой тип.
  • Отрицательные числа: функция корректно обрабатывает отрицательные значения, сохраняя знак минус.
  • Большие числа: если число очень большое, number_format() может вернуть результат в экспоненциальной записи (например, 1.0E+10). В таких случаях лучше сначала преобразовать число в строку или использовать sprintf() (см. альтернативный ответ).

Почему не подходит round()?

round() — это математическая функция, которая изменяет числовое значение, но не форматирует строку. Она возвращает число типа float, у которого "лишние" нули не хранятся (5.50 — это то же самое, что 5.5 для PHP). Для отображения нужно преобразовать число в строку с нужным форматом, и number_format() делает это идеально.

Таким образом, для вашей задачи (вывод цен с двумя знаками после запятой) number_format($price, 2) — это самый простой и правильный способ.

<<>>

Альтернатива: sprintf() для точного форматирования

Если вы предпочитаете более гибкий подход или работаете с числами, которые могут быть очень большими (где number_format() может дать сбой), используйте sprintf() с спецификатором формата %.2f:

<?php
$price1 = 10;
$price2 = 5.5;
$price3 = 3.456;

echo sprintf("%.2f", $price1) . "\n";  // 10.00
echo sprintf("%.2f", $price2) . "\n";  // 5.50
echo sprintf("%.2f", $price3) . "\n";  // 3.46
?>

Формат %.2f означает: "число с плавающей точкой, ровно 2 знака после запятой". Преимущества:

  • Не добавляет разделители тысяч (в отличие от number_format() с четырьмя параметрами).
  • Работает с любыми числами, включая очень большие, без риска экспоненциальной записи.
  • Легко комбинируется с другими строками (например, для вывода в шаблонах).

Недостаток: если вам понадобятся разделители тысяч, придётся дополнительно использовать number_format() или money_format() (устаревшая). Для простого вывода цен sprintf() — отличный выбор, особенно если вы уже знакомы с printf-форматированием из других языков.