在 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】:嗯...最好的办法是使用“真实”数字(float
、double
或 int
)存储和计算,并使用 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()的主要内容,如果未能解决你的问题,请参考以下文章