如何在PHP-jQuery中的DataTables中显示列的总和(其中所有值都是十进制值)?

时间:2017-12-09 18:05:14

标签: php jquery datatables

在我的PHP-jQuery DataTable中,所有行中列的所有值都是十进制值,并且还包含" "在十进制值之前签名如下:

+---------+
| Column  |
+---------+
| ₹ 1.20  |
+---------+
| ₹ 3.42  |
+---------+
| ₹ 9.07  |
+---------+

我想显示表格页脚上所有列的小数值总和,如下所示:

+----------------+
|     Column     |
+----------------+
|     ₹ 1.20     |
+----------------+
|     ₹ 3.42     |
+----------------+
|     ₹ 9.07     |
+----------------+
| ₹ 13.69 (Total)|
+----------------+  

我尝试使用" footerCallback"功能,但失败了:

"footerCallback": function ( row, data, start, end, display ) {
    var api = this.api(), data;

    // Remove the formatting to get integer data for summation
    var intVal = function ( i ) {
        return typeof i === 'string' ?
        i.replace(/[\$,₹]/g, '')*1 :
        typeof i === 'string' ?
        i : 0.00;
    };

    // Total over this page
    pageTotal = api
    .column( 4, { page: 'current'} )
    .data()
    .reduce( function (a, b) {
         return intVal(a) + intVal(b);
     }, 0 );

     // Update footer
     $( api.column( 4 ).footer() ).html(
         '₹ '+pageTotal +' (Total)'
     );
 },  

表格页脚的结果如下:

₹ NaN (Total)

请帮忙!

2 个答案:

答案 0 :(得分:0)

您的intVal函数检查该值是否为字符串,是否将其转换为数字,但如果它已经是数字,则返回0.

Yu不使用整数,十进制数是浮点数,所以这不适合加币,因为它只返回整数。

删除你的整个intVal函数并替换为这样的东西,它所做的只是删除任何不是数字或小数点的东西:

var floatVal = function ( i ) {
    return i.replace( /[^\d\.]/g, '');
};

然后更改pageTotal函数return intVal(a) + intVal(b);的这一行 对此,它会将您的数字作为浮点数加在一起,而不是将它们相互追加:

return parseFloat(floatVal(a)) + parseFloat(floatVal(b));

答案 1 :(得分:0)

如果有人正在寻找正确答案(多年后):

您需要将 typeof i === 'string' ? 更改为 typeof i === 'number' ?

这是一个即使使用过滤器也能工作的示例代码:

"footerCallback": function (row, data, start, end, display) {
                    var api = this.api(), data;

                    //Remove the formatting to get decimal data for summation
                    var intVal = function (i) {
                        return typeof i === 'string' ?
                            i.replace(/[\$,₹]/g, '') * 1 :
                            typeof i === 'number' ?
                                i : 0.00;
                    };

                    //Total over this page
                    pageTotal = api
                        .column(3, { filter: 'applied' })
                        .data()
                        .reduce(function (a, b) {
                            return intVal(a) + intVal(b);
                        }, 0);

                    //Update footer
                    $(api.column(3).footer()).html('$' + pageTotal);
                }