1

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

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

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

  • 2 150 000 欧元
  • 4 500 000 欧元
  • 225 000 欧元</li>

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

任何帮助将不胜感激。

您需要查看/测试它的所有内容:JSfiddle(尝试对列进行排序......)

4

2 回答 2

3

所以看起来你有两个问题。首先,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 );
}

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

于 2012-04-24T20:53:11.093 回答
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/

于 2012-04-24T22:23:07.320 回答