我需要存储代表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
答案 0 :(得分:2)
格式化后,数学函数可以改变相同的数字
永远不要这样做。它必然会流泪,例如,当您使用非英语小数分隔符格式化数字时。对原始数值执行操作,然后在输出之前立即格式化。
答案 1 :(得分:1)
这是由于PHP完成的自动类型转换。据我所知,PHP将能够在大多数通用数学函数中输入数字,但仍然没有明确的确定。 字符串将转换为必需的变量类型
答案 2 :(得分:0)
嗯......最好的方法是使用“真实”数字(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);
你很好! ; - )
答案 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$"
如果您的客户来自不同的国家/地区,只需为他们存储区域设置,他们就会获得预定义的号码。