2012-01-04 102 views
1

我有一个计算一对夫妇的收入值,然后将它们放在一起,这样一个循环:数字值四舍五入意外

$SalesGrowth = $C2012Sales+$C2011Sales; 

在某些情况下,这工作,我得到预期的,如:761.9 + 759.0 = 1520.9

在其他国家,它看起来像PHP随机决定不正确(??)圆,改变单位(?),我得到:

8,788.0 + 8,794.3 = 16

这里发生了什么事?我甚至试图回应由空格隔开的单独的销售价值,并且它们显示正确,因此底层数字没有错。

+4

它只是看起来不喜欢逗号,不是吗? – fge 2012-01-04 18:56:38

+0

@fge:不知道你是否有幽默感,但这个评论让我发笑:) – gahooa 2012-01-04 18:59:21

+0

在php.net上查看money_format – PurplePilot 2012-01-04 19:01:06

回答

9

解释为一个数字,8,788.0只是8,解析停在逗号。

如果您想允许像千位分隔符这样的噱头,那么您需要一些支持本地识别的数字解析。


更新:如果你有Zend Framework,你可以这样做:

require_once('Zend/Locale/Format.php'); 

$locale = new Zend_Locale('en_GB'); // #1 

$v = "8,410.5"; 
$n = Zend_Locale_Format::getNumber($v, array('locale' => $locale,'precision' => 3)); 

echo 2 * $number; // prints "16821" 

而不是硬编码的语言环境,你可以尝试把它从环境中:new Zend_Locale(setlocale(LC_ALL, ""))

+0

感谢 - 事情是,逗号正在由DataTable.js(用于显示排序表等的JavaScript库)打印。)所以这就是我如何粘贴他们 - 实际的销售数字刚刚被拉出MySQL数据库,并事先计算出来... – 2012-01-04 19:02:05

+0

Ohhhhhh - 是否number_format()插入逗号?我认为这就是发生了什么... – 2012-01-04 19:04:04

+0

@BenWilson:如果可以,请使用数据库中的实际数字,而不是某些格式化的字符串表示形式。 – 2012-01-04 19:04:20

2

这很简单...当您要求PHP使用+运算符时,它将隐式地将这些字符串(如"8,788.0")转换为数字值。既然你有一个,这个字符,它会终止这个数字的用处,并且它会被解释为8。等等...

摆脱非[0-9.]字符,它会更好地工作。

3

多德逗号问题....

删除所有来自数字逗号将它们之前...

str_replace(",","",$no1); 
+0

或使用floatval(); – 2012-01-05 01:50:54

2

注意,761.9是一个有效的数量,同时8,788.0不是(从PHP的观点)。

所以8,788.0在数字上下文将评估为8,就像8,794.3。并且8 + 8 = 16。

要解决此问题,请处理数据以使数字格式正确。