i have datatable and i want to sort in as numeric it contains value like 1st,2nd...., here is my code when i sort it it sorts values like 1st,10th,2nd so on how to sort it properly?
$('#example').DataTable( {
// "columnDefs": [
// { "visible": false, "targets": 4 }
// ],
"aaSorting": [[1,'asc']],
"columnDefs": [ {
"targets": [2,5,6],
"orderable": false
} ,
{
"targets": 0,
"orderable": false
},
{ "width": "5%", "targets": 0 },
{ "width": "8%", "targets": 1 }],
initComplete: function () {
this.api().columns().every( function () {
var column = this;
var select = $('<select><option value=""></option></select>')
.appendTo( $(column.footer()).empty() )
.on( 'change', function () {
var val = $.fn.dataTable.util.escapeRegex(
$(this).val()
);
column
.search( val ? '^'+val+'$' : '', true, false )
.draw();
} );
column.data().unique().sort().each( function ( d, j ) {
select.append( '<option value="'+d+'">'+d+'</option>' )
} );
} );
}
});
As I mentioned in my first answer for this post: DataTable should sort numbers normally, you have to set up the data in the proper format (Number). So you should use 123456,78, 12000.
The dataview.sort=columnName+"DESC" can just let me sort it in natural order. for example ,the quantitiy column sort as 1,10,100,1000,2,20,200,N/A. And this is not what i
Actual behavior Sorting places 1,000 < 999 or 1000 < 999. i.e. sorting columns with numbers only matches the first number shown and does not continue further regardless of the format of the number
Numbers are formatted to have spaces in between thousands unit (like 123 456 789). Unfortunately, this number formatting provoques a stringsorting instead of a numbersorting (see the screenshot at the end of this question). I have identified that: function _fnSort(oSettings, bApplyClasses) {is the core function for sorting.
I suggest using orthogonal data&HTML 5 in DataTable. It is simple and good solution.
It is simple solution, because it doesn't needs any configuration change or additional coding.
And it is good solution, because it separates sorting values from data representation. So you can show anything to user and sort by values as you would like to.
In each td
element there should be data-order
attribute. For an example:
<td data-order="3120">$3,120/m</td>
More about this https://datatables.net/manual/data/orthogonal-data
The simplest way I know of to do this is to use the Formatted Numbers
plugin
jQuery.extend( jQuery.fn.dataTableExt.oSort, {
"formatted-num-pre": function ( a ) {
a = (a === "-" || a === "") ? 0 : a.replace( /[^\d\-\.]/g, "" );
return parseFloat( a );
},
"formatted-num-asc": function ( a, b ) {
return a - b;
},
"formatted-num-desc": function ( a, b ) {
return b - a;
}
} );
$('#tbl_jaar').dataTable( {
columnDefs: [
{ type: 'formatted-num', targets: 0 }
]
} );
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdn.datatables.net/1.10.10/js/jquery.dataTables.min.js"></script>
<link href="https://cdn.datatables.net/1.10.10/css/jquery.dataTables.min.css" rel="stylesheet"/>
<table id="tbl_jaar">
<thead>
<tr>
<th>Places</th>
</tr>
</thead>
<tbody>
<tr>
<td>1st</td>
</tr>
<tr>
<td>2nd</td>
</tr>
<tr>
<td>3rd</td>
</tr>
<tr>
<td>4th</td>
</tr>
<tr>
<td>5th</td>
</tr>
<tr>
<td>6th</td>
</tr>
<tr>
<td>7th</td>
</tr>
<tr>
<td>8th</td>
</tr>
<tr>
<td>9th</td>
</tr>
<tr>
<td>10th</td>
</tr>
</tbody>
</table>
you need to define sType as numeric on the columndef where you want sorting as number
$('#example').DataTable( {
"aoColumns": [
{ "sType": "numeric" },
null,
null,
null,
null
],
// define at the place where sorting should by by numeric
// other options goes here
});
// with above the column at index 0 will be sorted by numeric and other columns are normal auto detected. the length of aoColumns should be equal to number of columns.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With