在 PHP 中处理货币 - 小数位和 number_format()

Posted

技术标签:

【中文标题】在 PHP 中处理货币 - 小数位和 number_format()【英文标题】:Dealing with currency in PHP - decimal places & number_format() 【发布时间】:2010-12-07 10:15:51 【问题描述】:

我需要在 2dp 中存储代表货币金额的数字,以便输出到屏幕上。相同的数字在格式化后可以用数学函数进行更改。我确定我记得过去由于数字格式的数字被视为字符串而出现错误,而千位分隔符是导致问题的原因,但下面的脚本运行时没有错误。

php 的松散数据类型是否可以节省时间?相对较新的 PHP 版本有什么变化吗?如果不是,在其他情况下number_format() 仍然会因为数字是字符串而导致数学函数失败?

echo round(1111123.2, 2); //included to demonstrate how it can't be used for this purpose
echo "<br />";
echo number_format(1111123.2, 2);
echo "<br />";
$num = number_format(1111123.2, 2);
echo number_format($num / 42, 2);

// output
1111123.2
1,111,123.20
0.02

【问题讨论】:

【参考方案1】:

相同的数字在格式化后可以用数学函数改变

永远不要这样做。例如,当您使用非英文小数分隔符格式化数字时,它一定会以泪水告终。对原始数值进行运算,然后在输出前立即格式化。

【讨论】:

【参考方案2】:

这是由于 PHP 完成了自动类型转换。据我了解,PHP 将能够在大多数通用数学函数中将类型转换为数字,但仍然不能明确地确定这一点。 字符串被转换为所需的变量类型

【讨论】:

【参考方案3】:

嗯...最好的办法是使用“真实”数字(floatdoubleint)存储和计算,并使用 number_format() 仅用于表示。 但是,如果您需要使用从number_format() 返回的数字进行计算,请考虑编写类似的函数

function unNumber_Format($str) 
   $search  = array(',', '$', '€');
   $replace = array('', '', '');

   return (double) str_replace($search, $replace, $str);

并像使用它

echo number_format(unNumber_Format($num) / 42, 2);

你很好! ;-)

【讨论】:

【参考方案4】:

更好的是使用数字格式化类:

但是它需要启用 intl 扩展和 php 5.3.0+.. (sudo apt-get install php5-intl)

$f = NumberFormatter::create("en-US",NumberFormatter::CURRENCY);
var_dump($f->format(1111123.2));
$f = NumberFormatter::create("en-US",NumberFormatter::CURRENCY);
$f->setSymbol(NumberFormatter::CURRENCY_SYMBOL,"€");
var_dump($f->format(1111123.2));
$f = NumberFormatter::create("de_DE",NumberFormatter::CURRENCY);
var_dump($f->formatCurrency(1111123.2,"EUR"));
$f = NumberFormatter::create("it_IT",NumberFormatter::CURRENCY);
var_dump($f->formatCurrency(1111123.2,"USD"));
$f = NumberFormatter::create("sk_SK",NumberFormatter::CURRENCY);
var_dump($f->formatCurrency(1111123.2,"USD"));

返回:

string(13) "$1,111,123.20"
string(15) "€1,111,123.20"
string(17) "1.111.123,20 €"
string(17) "US$ 1.111.123,20"
string(19) "1 111 123,20 US$"

如果您的客户来自不同的国家/地区,只需为他们存储区域设置,他们就会得到预定义的号码。

【讨论】:

以上是关于在 PHP 中处理货币 - 小数位和 number_format()的主要内容,如果未能解决你的问题,请参考以下文章

带小数和逗号的 PHP 回合 $1,000

number数值转化成为货币格式

php 删除十进制删除小数价格删除magento货币符号中的十进制价格编辑价格编辑货币编辑小数

通过jquery将货币转换为小数

sql server 货币 字段 类型 一般用啥类型?

货币的浮点精度:在 MySQL 查询 vs PHP vs Javascript 中使用“round”函数