簡體   English   中英

如何在codeigniter中對數據表求和

[英]how to sum datatables in codeigniter

結果只顯示$NaN ( $NaN total)

我剛剛從復制的代碼數據表,我只是更改列在這里我想總結一下。 這是我之前的代碼

<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 lib,仍然沒有任何反應。 我希望你的幫助。

主要問題

我認為問題出在您的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
}

在以下代碼段中可以看出兩種實現的差異:

 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變量,該變量footerCallback了傳遞給回調的同名參數。 此外, totalpageTotal變量看起來像隱式全局變量(它們聲明時沒有使用var關鍵字)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM