I have implemented the below logic for displaying calculation with data. So while displaying the data in Maintenance Point
column I am getting values as NaN
. But there should be no values. What is wrong in below column?
function displaySignOffSheetFTTX(ReportType, Month, DataList) {
var _reportType = (ReportType == 'ALL') ? "PAN INDIA" : ReportType;
var _month = Month;
var table = $('#grdCicleDatatable');
$(table).empty();
var thead = "";
var datalist = JSON.parse(DataList);
thead = "<thead><tr><th rowspan='2' class='text-left'>Sr.No</th><th rowspan='2' class='text-left'>Maintenance Point</th><th align='center' colspan='5'>Billable Scope Approved by CMM</th></tr><tr><th class='text-left'>UG Scope (KM)</th><th class='text-left'>Aerial Scope (KM)</th><th class='text-left'>MDU Scope (KM)</th><th class='text-left'>Aerial + MDU Scope (KM)</th><th class='text-left'>Total Scope (KM)</th></tr></thead>";
var tbody = "<tbody>";
table.append(thead);
table.append(tbody);
if (datalist != null && datalist.length > 0) {
var AerialMDUTotal = 0;
var UGAerialMDUTotal = 0;
$.each(datalist, function (key, val) {
key++;
val.UG_LENGTH = val.UG_LENGTH == null ? 0 : parseFloat(val.UG_LENGTH);
val.UG_LENGTH = val.UG_LENGTH.toFixed(2);
val.AR_LENGTH = val.AR_LENGTH == null ? 0 : parseFloat(val.AR_LENGTH);
val.AR_LENGTH = val.AR_LENGTH.toFixed(2);
val.MDU_LENGTH = val.MDU_LENGTH == null ? 0 : parseFloat(val.MDU_LENGTH);
val.MDU_LENGTH = val.MDU_LENGTH.toFixed(2);
AerialMDUTotal = parseFloat(val.AR_LENGTH) + parseFloat(val.MDU_LENGTH);
UGAerialMDUTotal = parseFloat(val.UG_LENGTH) + AerialMDUTotal;
UGAerialMDUTotal = UGAerialMDUTotal.toFixed(2);
var tr = "<tr><td>" + key + " </td><td>" + val.ITEM + "</td><td>" + val.UG_LENGTH + "</td><td>" + val.AR_LENGTH + "</td><td>" + val.MDU_LENGTH + "</td><td>" + AerialMDUTotal + "</td><td>" + UGAerialMDUTotal + "</td></tr>";
table.append(tr);
});
table.append('</tbody>');
}
var footer = "<tfoot><th colspan='1' style='text-align:center'><b>Total:</b></th><th class='text-center'></th><th class='text-center'></th><th class='text-center'></th><th class='text-center'></th><th class='text-center'></th><th class='text-center'></th></tfoot>";
table.append(footer);
oTable = $(table).dataTable({
dom: 'tp',
"dom": 'tp<"bottom"B><"clear">',
"searching": false,
responsive: true,
"autoWidth": true,
"bDestroy": true,
"pageLength": 6,
paging: false,
"columnDefs": [
{ "width": "7.7%", "targets": 0 },
{ "width": "7.7%", "targets": 1 },
{ "width": "7.7%", "targets": 2 },
{ "width": "7.7%", "targets": 3 },
{ "width": "7.7%", "targets": 4 },
{ "width": "7.7%", "targets": 5 },
{ "width": "7.7%", "targets": 6 }
],
buttons: [
{
"extend": "excelHtml5", "text": "Export to Excel", "filename": _reportType + "_SignOffSheet_" + _month,
title: 'Sign Of Sheet of ' + _reportType + ' Circle for ' + _month + ' Month',
exportOptions: {
columns: ':visible',
format: {
header: function (data, columnindex, trDOM, node) {
return GetColumnPrefixFTTX(columnindex) + data;
}
}
}
}
],
"footerCallback": function (row, data, start, end, display) {
var api = this.api(), data;
var intVal = function (i) {
return typeof i === 'string' ? i.replace(/[\$,]/g, '') * 1 : (typeof i === 'number' ? i : 0);
};
var FTTXUGTotal = api.column(1).data().reduce(function (a, b) { return intVal(a) + intVal(b); }, 0).toFixed(2);
var FTTXARTotal = api.column(2).data().reduce(function (a, b) { return intVal(a) + intVal(b); }, 0).toFixed(2);
var FTTXMDUTotal = api.column(3).data().reduce(function (a, b) { return intVal(a) + intVal(b); }, 0).toFixed(2);
var TotFTTXUGTotal = api.column(4).data().reduce(function (a, b) { return intVal(a) + intVal(b); }, 0).toFixed(2);
var TotFTTXARTotal = api.column(5).data().reduce(function (a, b) { return intVal(a) + intVal(b); }, 0).toFixed(2);
var TotFTTXMDUTotal = api.column(6).data().reduce(function (a, b) { return intVal(a) + intVal(b); }, 0).toFixed(2);
$(api.column(0).footer()).html('Total');
$(api.column(1).footer()).html(FTTXUGTotal);
$(api.column(2).footer()).html(FTTXARTotal);
$(api.column(3).footer()).html(FTTXMDUTotal);
$(api.column(4).footer()).html(TotFTTXUGTotal);
$(api.column(5).footer()).html(TotFTTXARTotal);
$(api.column(6).footer()).html(TotFTTXMDUTotal);
},
initComplete: function () {
var btns = $('.dt-button');
btns.addClass('btn btn-danger button');
btns.removeClass('dt-button');
}
});
$('.buttons-excel').css("display", "none");
}
Screenshot:
[![enter image description here][1]][1]
Here is the issue, because is doing the same for columns with numbers.
var FTTXUGTotal = api.column(1).data().reduce(
function (a, b) {
return intVal(a) + intVal(b);
}, 0)
.toFixed(2);
I suppose to do something like this:
//var FTTXUGTotal = api.column(1).data(); //["Anantapur","Kakinada"]
//var FTTXARTotal = api.column(2).data() //[0.35,13.12]
var intVal = function (i) {
let iString = typeof i === 'string';
let iNumber = typeof i === 'number';
return iString ? i.replace(/[\$,]/g, '') * 1 : iNumber ? i : 0;
};
let firstColumnData = ['5', 'Tirupati', '0.35', '11.53', '0.00', '11.53', '11.88']
let value = firstColumnData.reduce(function (a, b) {
let aCheck = isNaN(a) ? 0 : a;
let bCheck = isNaN(b) ? 0 : b;
return intVal(aCheck) + intVal(bCheck);
}, 0).toFixed(2);
console.log(value)
How to implement it:
// inside snippet footerCallback
"footerCallback": function (row, data, start, end, display) {
var api = this.api(), data;
var intVal = function(i) {
//readability
let iString = typeof i === "string";
let iNumber = typeof i === "number";
return iString ? i.replace(/[\$,]/g, "") * 1 : iNumber ? i : 0;
};
var total = function(data) {
return data.reduce(function(a, b) {
let aCheck = isNaN(a) ? 0 : a;
let bCheck = isNaN(b) ? 0 : b;
return intVal(aCheck) + intVal(bCheck);
}, 0).toFixed(2);
};
var FTTXUGTotal = api.column(1).data();
var FTTXARTotal = api.column(2).data();
var FTTXMDUTotal = api.column(3).data();
var TotFTTXUGTotal = api.column(4).data();
var TotFTTXARTotal = api.column(5).data();
var TotFTTXMDUTotal = api.column(6).data();
$(api.column(0).footer()).html("Total");
$(api.column(1).footer()).html(total(FTTXUGTotal));
$(api.column(2).footer()).html(total(FTTXARTotal));
$(api.column(3).footer()).html(total(FTTXMDUTotal));
$(api.column(4).footer()).html(total(TotFTTXUGTotal));
$(api.column(5).footer()).html(total(TotFTTXARTotal));
$(api.column(6).footer()).html(total(TotFTTXMDUTotal));
}
After chatting in a discussion, we found the best way was:
$(api.column(1).footer()).html(isNaN(FTTXUGTotal) ? '' : FTTXUGTotal);