将字符串排序为数字的数据表

Posted

技术标签:

【中文标题】将字符串排序为数字的数据表【英文标题】:datatable sorting on string as number 【发布时间】:2017-03-04 11:40:24 【问题描述】:

我有数据表,我想以数字形式排序,它包含像 1st,2nd 之类的值....,这是我的代码,当我对其进行排序时,它对 1st,10th,2nd 等值进行排序,等等如何正确排序?

$('#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>' )
       );
     );
  
); 

【问题讨论】:

【参考方案1】:

我建议在 DataTable 中使用正交数据和 html 5。这是简单而好的解决方案。

这是一个简单的解决方案,因为它不需要任何配置更改或额外的编码。

这是一个很好的解决方案,因为它将排序值与数据表示分开。因此,您可以向用户显示任何内容并根据需要按值排序。

在每个td 元素中应该有data-order 属性。举个例子:

&lt;td data-order="3120"&gt;$3,120/m&lt;/td&gt;

更多关于这个https://datatables.net/manual/data/orthogonal-data

【讨论】:

【参考方案2】:

我知道的最简单的方法是使用Formatted Numbers 插件

这是一个例子:

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>

【讨论】:

【参考方案3】:

您需要在要排序为数字的 columndef 上将 sType 定义为数字

$('#example').DataTable( 
   "aoColumns": [
       "sType": "numeric" ,
      null,
      null,
      null,
      null
    ],
// define at the place where sorting should by by numeric
// other options goes here
);

// 上面索引为 0 的列将按数字排序,其他列正常自动检测。 aoColumns 的长度应该等于列数。

【讨论】:

【参考方案4】:
$.extend($.fn.dataTable.ext.oSort, 
    "numNonStandard-asc": function (a, b) 

      if(!isNaN(parseInt(a.substring(1))))
        a = parseInt(a.substring(1));
      
      if(!isNaN(parseInt(b.substring(1))))
        b = parseInt(b.substring(1));
      
      return (a == b) ? 0 : (a < b) ? 1 : -1;
    ,
    "numNonStandard-desc": function (a, b) 
      if(!isNaN(parseInt(a.substring(1))))
        a = parseInt(a.substring(1));
      
      if(!isNaN(parseInt(b.substring(1))))
        b = parseInt(b.substring(1));
      
      return (a == b) ? 0 : (a < b) ? -1 : 1;
    
  );

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于将字符串排序为数字的数据表的主要内容,如果未能解决你的问题,请参考以下文章

将 varchar 字符串排序为数字

Mysql字符串中有数字的排序问题

Mysql字符串中有数字的排序问题

MySQL 数字字符串按照数字排序

mysql自动排序为啥10在1后面不在9后面

排序字符串数字[重复]