如何在codeigniter中对数据表求和

Posted

技术标签:

【中文标题】如何在codeigniter中对数据表求和【英文标题】:how to sum datatables in codeigniter 【发布时间】:2021-01-16 19:06:57 【问题描述】:

结果只是显示 $NaN ( $NaN total)

我只是从datatables 复制代码,然后我只是更改了我想要对其求和的列。 这是我之前的代码

<script>
$(document).ready(function() 
$('#tableoperasional').DataTable( 
  "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 === 'number'
         ? i 
         : 0;
     ;

    // Total over all pages
    total = api
      .column( 2 )
      .data()
      .reduce( function (a, b) 
        return intVal(a) + intVal(b);
      , 0 );
                             
      // Total over this page
      pageTotal = api
        .column( 2,  page: 'current' )
        .data()
        .reduce( function (a, b) 
          return intVal(a) + intVal(b);
        , 0 );
                             
        // Update footer
        // Update footer
        $( api.column( 2 ).footer() ).html(
          '$'+pageTotal +' ( $'+ total +' total)'
        );
      
    );
  );
</script>

我也更新了 js 库,但仍然没有任何反应。我希望你的帮助。

【问题讨论】:

添加了相关的javascript、jquery、jquery-datatables标签;格式化的代码可读。 我不明白你的意思 :( 。顺便说一句,我是 JS 新手。 添加该评论是因为我编辑了问题 ;-) 在下面查找答案。 【参考方案1】:

主要问题

我认为问题在于您的intVal 函数。当String 传入其中时,所有$, 字符都将被删除,结果乘以1(将其转换为Number)。但是,如果 String.prototype.replace 没有删除所有非数字字符,则转换将失败并返回 NaN

例如:

var valueInColumn = '12,45%';
var nanResult = valueInColumn.replace(/[\$,]/g, '') * 1;
console.log(nanResult);

不要使用隐式转换 (* 1),而是通过 parseFloat/parseInt 使用显式转换。它的意图更清楚,也比隐式转换更安全:

var intVal = function (i) 
  return typeof i === 'string'
    ? parseFloat(i.replace(/[\$,]/g, '')) // <-- here
    : typeof i === 'number'
    ? i
    : 0;

如果这不能解决问题,intVal 可以变得更安全/更严格。方法如下:

var safeIntVal = i => 
  var rval = i;
  if (typeof rval === 'string') 
    rval = parseFloat(rval.replace(/[^\d\.]/g, ''));    // <-- remove all non-numeric characters except dots and convert into a number
  
  if (typeof rval !== 'number' || Number.isNaN(rval))  // <-- if the result of the conversion isn't a number or is NaN, set it to zero
    rval = 0;
  
  return rval;                                          // <-- return

两种实现方式的差异在以下 sn-p 中可见:

var intVal = function ( i ) 
  return typeof i === 'string' 
    ? i.replace(/[\$,]/g, '') * 1
    : typeof i === 'number'
    ? i 
    : 0;
;

var safeIntVal = function (i) 
  var rval = i;
  if (typeof rval === 'string') 
    rval = parseFloat(rval.replace(/[^\d\.]/g, ''));
  
  if (typeof rval !== 'number' || Number.isNaN(rval)) 
    rval = 0;
  
  return rval;




var testString = 'a23,3.65$b';

console.log('Original intVal result:', intVal(testString));
console.log('Modified safeIntVal result:', safeIntVal(testString));

旁注

您在 footerCallback 函数中声明了一个 data 变量,该变量会隐藏传递给回调的同名参数。此外,totalpageTotal 变量看起来像隐式全局变量(它们的声明没有 var 关键字)。

【讨论】:

以上是关于如何在codeigniter中对数据表求和的主要内容,如果未能解决你的问题,请参考以下文章

我可以在 Reporting Services 2008 中对多重查找值求和吗

如何在 codeIgniter 中对文件使用分页

如何在 pyspark 中对 spark 数据框中的多列求和?

如何在 pyspark 中对 spark 数据框中的多列求和?

如何在 SQL 中对多列求和

如何在SQL中对相邻行进行分组并对数据求和