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

时间:2010-12-07 10:15:51

标签: php number-formatting

我需要存储代表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

4 个答案:

答案 0 :(得分:2)

  

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

永远不要这样做。它必然会流泪,例如,当您使用非英语小数分隔符格式化数字时。对原始数值执行操作,然后在输出之前立即格式化。

答案 1 :(得分:1)

这是由于PHP完成的自动类型转换。据我所知,PHP将能够在大多数通用数学函数中输入数字,但仍然没有明确的确定。 字符串将转换为必需的变量类型

答案 2 :(得分:0)

嗯......最好的方法是使用“真实”数字(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);

你很好! ; - )

答案 3 :(得分:0)

最好使用数字格式化程序类:

然而它需要启用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$"

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