DataTables按编号字段排序

时间:2012-02-10 16:28:19

标签: php jquery datatable

我有一个代表我DataTable Grid中货币值的列,我如何才能正确订购此值,因为dataTable仅按第一个数字排序,例如:

9.000,00

8.000,00

5.454.043,00

4.454.043,00

当然应该是这样的:

5.454.043,00

4.454.043,00

9.000,00

8.000,00

我正在使用number_format设置我的资金格式。

PHP:

<td>".number_format($money,2,',','.')."</td>

任何问题,请成为我的客人。

感谢。


修改

作为@Mikhail的答案,试试这个,但位置3的列不再排序。

 ...
"aoColumnDefs": [
  { "sType": "numeric", "aTargets": [ 3 ] }
],
...

编辑2

更多代码:

PHP:

while(!$res->EOF){
    ... // post only the 3 <td> position
   <td style='text-align: right;'>".number_format($value,2,',','.')."</td>
   ...
   $res->MoveNext();
}

js DataTable

var oTable = $('#example').dataTable({
                    "bJQueryUI": true,
                    "sScrollY": "225px",
                    "sScrollX": "100%",
                    "sScrollXInner": "100%",
                    "bDestroy" : true,
                    "bScrollCollapse": true,
                    "aoColumnDefs": [
                        { "sType": "numeric", "aTargets": [ 3 ] }
                    ],
                    "sDom": '<"H"Tfr>t<"F"ip>',
                    "oTableTools": {
                        "sSwfPath": "js/DataTables/extras/TableTools/media/swf/copy_cvs_xls_pdf.swf",
                        "sRowSelect": "single",
                        "aButtons": [
                                        {
                                            "sExtends": "xls",
                                            "sButtonText": "Excel"
                                        },
                                        {
                                            "sExtends": "print",
                                            "sButtonText": "Print"
                                        }
                                    ]
                    },
                    "aaSorting": [[ 0, "asc" ]],
                    "bPaginate": false
                });

解决方案

我的解决方案是使用不带number_format的值创建一个新列,将其隐藏为this。搜索其他的排序方式,我想iDataSort 现在我可以在显示栏中格式化任何内容。

4 个答案:

答案 0 :(得分:2)

您需要将字符串转换回float,您可以为此定义自己的数据类型(未经测试):

(function(){

    var tofloat = function(n) {
        return parseFloat(n.replace('.', '').replace(',', '.'));
    };

    $.fn.dataTableExt.oSort['mynumeric-asc']  = function(a, b) {
        a = tofloat(a);
        b = tofloat(b)

        return ((a < b) ? -1 : ((a > b) ?  1 : 0));
    };

    $.fn.dataTableExt.oSort['mynumeric-desc'] = function(a, b) {
        a = tofloat(a);
        b = tofloat(b)

        return ((a < b) ? 1 : ((a > b) ?  -1 : 0));
    };

}());

然后声明"sType": "mynumeric"

要进行比较,这是DataTables中数字排序的完整代码:

/*
 * numerical sorting
 */
"numeric-asc": function ( a, b )
{
    var x = (a=="-" || a==="") ? 0 : a*1;
    var y = (b=="-" || b==="") ? 0 : b*1;
    return x - y;
},

"numeric-desc": function ( a, b )
{
    var x = (a=="-" || a==="") ? 0 : a*1;
    var y = (b=="-" || b==="") ? 0 : b*1;
    return y - x;
}

如您所见,转换为数字的方法是将字符串乘以1,该字符串不知道逗号或用作除小数分隔符以外的任何内容的点。

答案 1 :(得分:0)

简而言之,您可以使用:

natsort($array);

答案 2 :(得分:0)

您需要指定该列是“数字”。

http://datatables.net/usage/columns#sType

祝你好运!

答案 3 :(得分:0)

在没有看到任何更多代码的情况下,很难确切地确定要做什么,但是它当前正在执行的原因似乎是由于number_format函数。这将返回string,因此排序正确。您需要在将其转换为字符串之前执行排序。但是为了更深入的解释,您需要提供更深入的代码。