PHP конвертировать деньги в строку

#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 не работают с форматированным выводом. Таким образом, удаление разделителя действительно стало бы отправной точкой для возврата к фактическому числу.