如何使用Natural sort插件制作DataTables工作?

我见过一些类似的问题,但在我的案例中没有正确答案。

我使用DataTables插件对一些表进行排序。

但是我们不能像数字那样对数据进行排序而不是(坚果;-p)。 例如,我们无法对格式化的价格进行排序:

  • 2 150 000€
  • 4 500 000€
  • 225 000€

所以我尝试包含一个名为“ Natural sort ”的DataTables插件 。 但它似乎不起作用,我可能会犯一些错误,但我找不到它们。

任何帮助将不胜感激。

所有你需要看到/测试它: JSfiddle (尝试排序列……)

所以看起来你有两个问题。 首先,dT没有拿起你的自定义排序 – 它只是忽略它并使用标准排序。 我能够通过指定每列的排序来解决这个问题:

$('#table_list').dataTable({ "aoColumns": [null, {"sType": "natural"}, null, null], "aaSorting": [[ 1, "asc" ]], "sScrollX": "100%", }); 

其次,自然排序不会按照您期望的方式对这些数字进行排序。 它会占用第一个数字部分直到空格并对其进行排序,如下所示:

 2 150 000 € 4 750 000 € 210 000 € 

所以你可能只想写自己的排序。 这是我尝试的一个例子:

 function testSort( a, b ) { var aa = a.replace(/[ \.]/g,''), bb = b.replace(/[ \.]/g,''); aa = parseInt( aa.substring( 0, aa.length - 1 ) ); bb = parseInt( bb.substring( 0, bb.length - 1 ) ); return aa == bb ? 0 : ( aa < bb ? -1 : 1 ); } 

关键是删除空格,句号和欧元符号,以便可以将其读作数字。

谢谢@Ryan P我的sType声明错了……

最后,我需要添加更多插件才能使其正常工作,如果可以帮助某人,我会分享它:

  • 自然排序:用于varchar值
 jQuery.fn.dataTableExt.oSort['natural-asc'] = function(a,b) { return naturalSort(a,b); }; jQuery.fn.dataTableExt.oSort['natural-desc'] = function(a,b) { return naturalSort(a,b) * -1; }; 
  • 将“null”类型取消转换为formated-num:
 jQuery.fn.dataTableExt.aTypes.unshift( function ( sData ) { var deformatted = sData.replace(/[^\d\-\.\/a-zA-Z]/g,''); if ( $.isNumeric( deformatted ) ) { return 'formatted-num'; } return null; } ); 
  • Formatted-num:用于…格式化数字值
 jQuery.fn.dataTableExt.oSort['formatted-num-asc'] = function(a,b) { /* Remove any formatting */ var x = a.match(/\d/) ? a.replace( /[^\d\-\.]/g, "" ) : 0; var y = b.match(/\d/) ? b.replace( /[^\d\-\.]/g, "" ) : 0; /* Parse and return */ return parseFloat(x) - parseFloat(y); }; jQuery.fn.dataTableExt.oSort['formatted-num-desc'] = function(a,b) { var x = a.match(/\d/) ? a.replace( /[^\d\-\.]/g, "" ) : 0; var y = b.match(/\d/) ? b.replace( /[^\d\-\.]/g, "" ) : 0; return parseFloat(y) - parseFloat(x); }; 

这里的工作示例: http : //jsfiddle.net/DzaQe/3/