使用有符号整数运行帐户余额,返回负数

时间:2011-10-21 19:16:17

标签: php mysql

我一直试图在我正在处理的财务应用中弄清楚签名整数和PHP的奇怪问题。每笔交易的金额都是有符号整数,我使用SUM()平衡帐户,并且有一个函数可以输出每个条目的运行余额,按行iddate降序排列

在账户余额低于0(-6.20左右)之前,一切似乎都运转正常。当输入存款时,而不是简单地返回正数,运行总输出1.00和几乎每个交易之前的运行总数读为负数 - 除了可能是接近或低于0美元的那些。相当困惑..这里是函数(类的一部分):

public function fetchTransactions($limit = null) {
        global $db;
        $this->balanceAccount(); //Calls upon another function to return the balance
        $runningTotal = $this->accountBalance;
        $prevAmount = 0;
        if (isset($limit)) {
            $sql = "SELECT amount, payee, cat, date FROM transactions ORDER BY date DESC, id DESC LIMIT $limit";
        } else {
            $sql = "SELECT amount, payee, cat, date FROM transactions ORDER BY date DESC, id DESC";
        }
        $fetchTransactionsSQL = $db->query($sql);
        while ($transactionDetails = $fetchTransactionsSQL->fetch()) {
            $date = date("m/d", strtotime($transactionDetails['date']));
            $payee = stripslashes($transactionDetails['payee']);
            $category = $transactionDetails['cat'];
            $amount = $transactionDetails['amount'];
            $runningTotal -= $prevAmount; //I have also tried addition here
            $prevAmount = $amount;
            $amountOutput = (strpos($amount, '-') === true ? '-' . money_format("%n", $amount) : money_format("%n", $amount));
            $runningTotalOutput = money_format("%n", $runningTotal);
            echo "
                <tr>
                    <td>$date</td>
                    <td><strong>$payee</strong></td>
                    <td>$category</td>
                    <td>$amountOutput</td>
                    <td>$runningTotalOutput</td>
                </tr>                    
            ";
        }
    }

非常感谢任何帮助。谢谢!

编辑=进一步说明

澄清一些困惑。这些条目是按降序从数据库中提取的,其中最后一个事务位于MySQL表的末尾,但第一个事务显示在页面上。我从0开始$prevAmount,然后在循环期间将其设置为当前事务的金额。 $runningTotal以整体帐户余额开始,并且通过在循环期间从$prevAmount减去上一个交易的金额($runningTotal)来获得运行余额。如果有人能够提出一个更简单的方法来实现这一目标,那我就全力以赴 - 在账户余额低于0之前,它运作良好。

2 个答案:

答案 0 :(得分:0)

$amountOutput = (strpos($amount, '-') === true ? '-' . money_format("%n", $amount) : money_format("%n", $amount));

这整个构造毫无意义。 money_format()完全有能力处理负数。您所做的只是在已经为负数的位置添加 SECOND 负号。

$amountOutput = money_format('%n', $amount);

答案 1 :(得分:0)

需要在我的代码中寻找问题的其他地方的简单案例。无论出于何种原因,我在起始余额和帐户余额功能的输出上都使用了number_format()。显然这妨碍了数学运算,一切都按照从这些函数中删除后的方式工作。嘘声糟糕的代码,好好搞清楚!