#php
#php
Вопрос:
У меня есть фрагмент кода, который создает индикатор выполнения на моей странице, чтобы показать, сколько пользователь потратил из выделенной суммы.
$roof = 75
$total = 275.00
это работает нормально
$total = 1,202.00
это прерывается из-за запятой
<div class="progress"> <div class="progress-bar <?php if($total > $roof) { echo 'progress-bar-danger'; } ?>" role="progressbar" aria-valuenow="<?php echo $total ; ?>" aria-valuemin="0" aria-valuemax="<?php echo $roof ; ?>" style="width: <?php echo $total ; ?>%;">
lt;?php echo $total ; ?> of
lt;?php echo $roof ; ?> cap</div>
</div>
Как я могу заставить это работать правильно с более высокими суммами в долларах, которые включают эти запятые?
Комментарии:
1. используйте str_replace(), чтобы заменить запятую на точку
2. Откуда берется значение
$total
? Извлекается ли он динамически из базы данных и т. Д. Или Вы его предоставляете?3. он поступает из базы данных
Ответ №1:
Вы не должны выполнять какую-либо логику с уже отформатированной строкой. Сохраняйте $total
чистое целое число или число с плавающей запятой и добавляйте только десятичную точку и разделитель тысяч при выводе.
В PHP есть полезная number_format()
функция для этого.
<?php
// Central function that is responsible to format currency
// values for display
function formatMoney($sum) {
$formattedString = number_format($sum, 2, "." , ",");
return $formattedString
}
$roof = 1000;
$total = 1202;
?>
<div>
<?php
// Format the number just for output:
echo formatMoney($total);
// $total remains a number:
if ($total > $roof) {
echo "warning";
}
?>
</div>
С помощью этого шаблона ваша бизнес-логика не будет зависеть от того, как значение валюты отображается пользователю. В противном случае у вас возникнут проблемы, если вы решите изменить форматирование номера позже (например, при добавлении локализации).
Если у вас нет доступа к неформатированному значению $total
, вам нужно разобрать его обратно в число:
// Remove thousands separator and parse into a Float value:
$total = floatval(str_replace(",", "", $formattedTotal));
Теперь вы можете снова использовать его как число и использовать для таких вещей, как $total > $roof
.
Комментарии:
1. Я сохранил свои данные в своей таблице как «Деньги», поэтому они выглядят примерно так
25.0000
. Этот процесс, похоже, не сработал в этом отношении2. Если вы храните эти значения в виде строк в своей базе данных, вы хотите изменить это. Проблема очевидна: вы не можете выполнить какое-либо сравнение или вычисление с этими «числами». Если вы не можете перейти к дизайну приложения, вам нужно будет тщательно преобразовать строки обратно в реальные числа.
3. Я могу изменить интерфейс, как мне нужно, данные хранятся как
money
тип данных в базе данных, которая отформатирована следующим25.0000
образом.4. Я обновил свой ответ предложением преобразовать строку обратно в число с плавающей запятой.
5. Просто из любопытства: какую базу данных вы используете?
Ответ №2:
Используйте echo number_format($total), вам не нужно форматировать его самостоятельно.
Ответ №3:
Один из способов:
$total = str_replace(',', '', $total);
Комментарии:
1. Оператору требуется хорошо отформатированный вывод (с разделителем тысяч). Было бы бесполезно удалять разделитель. Кроме того, $total должен быть значением с плавающей запятой (реальным), но для его форматирования с разделителем в тысячи потребуется строка .
2. Проблема OPs в том, что подобные сравнения
$total > $roof
не работают с форматированным выводом. Таким образом, удаление разделителя действительно стало бы отправной точкой для возврата к фактическому числу.