在PHP

时间:2015-06-16 20:35:14

标签: php arrays

我有一个传递信息的HTML表单,特别是我要添加的数字。当我添加这些值时,由于某种原因,我的几个值没有正确添加。这是我的原始代码:

以下是从表单传递的数组:

289.03
439.08
147.35
153.82
163.94
382.76
2359.43
1983.83

这是PHP代码:

<?php
$netRate = $_POST['netrate'];
$payloads = $_POST['topay'];
$netLoad=0;

for($i=0;$i<=count($payloads);$i++)
    {
        if(!empty($payloads[$i]))
        {
            ///other code is in here/////
            echo '<td width="60" valign="top">'.$netRate[$i].'</td>';   

            $netLoad = $netLoad + $netRate[$i];

            echo "net rate: ". $netRate[$i];
            echo "<br>";
            echo "net load (sum of all loads): ". $netLoad;
            echo "<br>";
        }
    }

?>

这些是我从echo语句中得到的结果:

net rate: 289.03
net load (sum of all loads): 289.03
net rate: 439.08
net load (sum of all loads): 728.11
net rate: 147.35
net load (sum of all loads): 875.46
net rate: 153.82
net load (sum of all loads): 1029.28
net rate: 163.94
net load (sum of all loads): 1193.22
net rate: 382.76
net load (sum of all loads): 1575.98
net rate: 2,359.43
net load (sum of all loads): 1577.98
net rate: 1,983.83
net load (sum of all loads): 1578.98

所以即使数组的最后两个$ netRate部分是正确的(2359.43&amp; 1983.83),$ netLoad也没有正确添加它们。这可能是什么问题?

2 个答案:

答案 0 :(得分:2)

这里的问题是$ netRate实际上是一个字符串数组。当您使用+运算符时,PHP会将这些字符串转换为数字值。不幸的是,您的系统/ PHP正在将“,”识别为十进制字符并将2,359.43转换为2.35

floatval的使用会遇到与隐式转换相同的问题。即系统会将错误的字符识别为十进制字符。

解决这个问题看似简单的方法就是在转换之前从字符串中删除任何“,”:

// do NOT use this $netLoad = $netLoad + str_replace(",", "", $netRate[$i]);

不幸的是使用“。”和“,”取决于提交表单的用户的区域设置,因此您可以根据提交数据的人员预期不同的字符。 (这就是为什么许多API以美分而非值发送值,例如100而不是1.00)。

但是有一个解决方案。

如果您查看以下页面上的评论: http://php.net/manual/en/function.floatval.php

你可以看到有人提交了一个tofloat函数,它将使用最后一个逗号或点来解决问题,以执行转换。

享受。

答案 1 :(得分:1)

$netRate  = number_format( $_POST['netrate'] ,2,".","");
$payloads = number_format( $_POST['topay'] ,2,".","");