Как преобразовать число в сумму в долларах в PHP

Как преобразовать число в строку, показывающую доллары и центы?

eg:
123.45    => '$123.45'
123.456   => '$123.46'
123       => '$123.00'
.13       => '$0.13'
.1        => '$0.10'
0         => '$0.00'

person nickf    schedule 17.11.2008    source источник
comment
Вы имеете в виду какой-то конкретный язык программирования?   -  person Bill the Lizard    schedule 17.11.2008
comment
Я предполагаю, что это должно быть определенным - я изменю это сейчас.   -  person nickf    schedule 17.11.2008
comment
Будьте осторожны с неявным округлением, введенным форматированием с плавающей запятой до определенной цифры. Если есть два элемента со значением 0,015 доллара США, могут возникнуть ситуации, когда 2 + 2 = 3. Также обратите внимание, что числа с плавающей запятой не могут точно хранить простые значения, такие как 0,1.   -  person Eugene Yokota    schedule 17.11.2008
comment
Вы должны использовать целые числа и хранить количество центов, а не использовать числа с плавающей запятой, иначе вы потеряете несколько центов по пути.   -  person too much php    schedule 17.11.2008


Ответы (6)


PHP также имеет money_format().

Вот пример:

echo money_format('$%i', 3.4); // echos '$3.40'

Эта функция на самом деле имеет множество опций, перейдите к документации, на которую я ссылаюсь, чтобы увидеть их.

Примечание: money_format не определен в Windows.


ОБНОВЛЕНИЕ: В руководстве по PHP: https://www.php.net/manual/en/function.money-format.php

ВНИМАНИЕ! Эта функция [money_format] объявлена ​​УСТАРЕВШЕЙ, начиная с PHP 7.4.0. Крайне не рекомендуется полагаться на эту функцию.

Вместо этого загляните в NumberFormatter::formatCurrency.

    $number = "123.45";
    $formatter = new NumberFormatter('en_US', NumberFormatter::CURRENCY);
    return $formatter->formatCurrency($number, 'USD');
person Paige Ruten    schedule 17.11.2008
comment
Из документа: Примечание. Функция money_format() определена только в том случае, если в системе есть возможности strfmon. Например, в Windows это не так, поэтому money_format() в Windows не определен. - person too much php; 17.11.2008
comment
Мне нравится этот подход больше всего в теории, но почему мой результат составляет $3,40. Знаете ли вы, какие параметры я могу изменить, чтобы получить вывод выше (без доллара США)? Очевидно, я бы предпочел сделать это без str_replace или регулярных выражений. - person MCybertron; 18.03.2014
comment
Нашел ответ здесь. Просто выполните money_format('%.2n', 3.4); - person MCybertron; 18.03.2014
comment
Эта функция сейчас устарела? Когда я его использую, он теперь «не определен». - person 5120bee; 27.11.2016
comment
Но money_format('$%i', 3.4) обрабатывает негативы не так, как предпочло бы большинство людей. - person Ryan; 06.07.2018
comment
Функция money_format() устарела. Его можно заменить функциональностью intl NumberFormatter. Ссылка: php.net/manual/en/migration74.deprecated.php - person Radmation; 03.12.2019

Если вы просто хотите что-то простое:

'$' . number_format($money, 2);

number_format()

person Darryl Hein    schedule 17.11.2008
comment
имейте в виду, что это добавит запятую (или ее эквивалент в вашей локали) после каждой группы из трех цифр. это может быть желательно, но может быть очень запутанным, если вы этого не ожидаете. - person nickf; 17.11.2008
comment
Чтобы сделать это без разделителей тысяч: '$' . number_format($money, 2, '.', ''); - person Justin Anderson; 18.04.2012
comment
это не работает для отрицательных чисел, мы используем -69,42 доллара, а не -69,42 доллара. - person Cano64; 01.03.2018

Я пробовал money_format(), но у меня это вообще не сработало. затем я попробовал следующий. это сработало идеально для меня. надеюсь, это сработает и для вас.. :)

вы должны использовать этот

number_format($money, 2,'.', ',')

он покажет число денег в денежном формате до 2 знаков после запятой.

person saadk    schedule 03.02.2014

В PHP и C++ вы можете использовать функцию printf().

printf("$%01.2f", $money);
person nickf    schedule 17.11.2008
comment
Встроенные функции PHP действительно удобны. - person Darryl Hein; 17.11.2008

Обратите внимание, что в PHP 7.4 функция money_format() устарела. Его можно заменить функциональностью intl NumberFormatter, просто убедитесь, что вы включили расширение php-intl. Это небольшое усилие, но оно того стоит, так как вы получаете широкие возможности настройки.

$f = new NumberFormatter("en", NumberFormatter::CURRENCY);
$f->formatCurrency(12345, "USD"); // Outputs "$12,345.00"

Быстрый способ, который все еще будет работать для версии 7.4, упоминается Darryl Hein:

'$' . number_format($money, 2);
person Jon    schedule 22.02.2020

В php.ini добавьте это (если оно отсутствует):

#windows
extension=php_intl.dll

#linux
extension=php_intl.so

Затем сделайте следующее:

$amount = 123.456;

// for Canadian Dollars
$currency = 'CAD';

// for Canadian English
$locale = 'en_CA';

$fmt = new \NumberFormatter( $locale, \NumberFormatter::CURRENCY );
echo $fmt->formatCurrency($amount, $currency);
person Frank Forte    schedule 06.11.2018