2012-07-05 128 views
10

我正在使用jquery.datatables在數據表列中顯示數字。數字被格式化爲在數千個單位之間具有空格(如123 456 789)。不幸的是,這個數字格式提供了字符串排序,而不是號碼排序(請參見本問題末尾的屏幕截圖)。DataTables對字符串進行排序而不是數字

我已經確定了:

  • function _fnSort(oSettings, bApplyClasses) {是排序的核心功能。
  • 在該功能中,使用動態功能排序的方法(所述一個執行如果if (!window.runtime) {爲true)
  • 字符串排序功能使用的是以下兩個功能。

    /* 
    * text sorting 
    */ 
    "string-asc": function(a, b) { 
        var x = a.toLowerCase(); 
        var y = b.toLowerCase(); 
        return ((x < y) ? -1 : ((x > y) ? 1 : 0)); 
    }, 
    
    "string-desc": function(a, b) { 
        var x = a.toLowerCase(); 
        var y = b.toLowerCase(); 
        return ((x < y) ? 1 : ((x > y) ? -1 : 0)); 
    }, 
    

我在JavaScript知識是非常不好的,你會在這裏是最好的方法?

  1. 扭捏串排序功能檢測數十萬格式化情況,並做比較(我想這將是對大數據集很慢)。
  2. 提供專用於數字千位格式的數字排序功能?在這種情況下,
    • 你會如何編碼?
    • 我怎麼能指出核心排序功能,使用這個特殊的數字排序功能?

以下是排序的樣子現在:

enter image description here

回答

10

要解決這一種價值觀,就可以使用這種功能:

var sortFunction=function(a, b)​{ 
    var ia = parseInt(a.split(' ').join(''), 10); 
    var ib = parseInt(b.split(' ').join(''), 10); 
    return ia-ib; 
}; 

測試:

var data = ['3 333', '100 333', '22 000', '1 333']; 
console.log(data.sort(sortFunction)); 

使用合理數量的值,這將足夠快。如果您未檢測到性能問題,則不應嘗試豐富數據。

編輯:

事實上,the documentation提出適當的(類似)的排序功能:

jQuery.extend(jQuery.fn.dataTableExt.oSort, { 
    "formatted_numbers-pre": function (a) { 
     a = (a==="-") ? 0 : a.replace(/[^\d\-\.]/g, ""); 
     return parseFloat(a); 
    }, 

    "formatted_numbers-asc": function (a, b) { 
     return a - b; 
    }, 

    "formatted_numbers-desc": function (a, b) { 
     return b - a; 
    } 
}); 

已經添加了此擴展後,你只需要設置你列的sType

+0

太棒了!但是,我怎麼能強制_fnSort()使用這個排序功能的相關列? – 2012-07-05 09:33:03

+1

請參閱編輯(鏈接到文檔)。 – 2012-07-05 09:38:47

+2

DataTables的作者在這裏 - 很好的答案 - 投票。我建議標記爲正確/接受:-)。只有錯字是sType爲大寫'T':http://datatables.net/ref#sType。還值得指出的是,還有很多其他排序插件(一些與類型檢測對應) - http://datatables.net/plug-ins/sorting – 2012-07-05 10:00:53

0

好吧,經過大量的搜索,我找到了一個替代解決方案。提出的解決方案Allan Jardine肯定是比較乾淨的。但它意味着觸摸HTML並觸及HTML挑釁的棘手消息框,如下所示。

enter image description here

所以我的解決辦法是剛剛接觸JavaScript字符串排序算法中,對數字和文本的情況下之間進行切換。我希望它可以通過使用像isDigit(sa.charAt[0])這樣的更清潔,但它只是不工作,儘管我所有的嘗試。至少這個解決方案的工作,並不意味着任何性能顯着降低:

/* 
    * text + integer sorting 
    */ 
    "string-asc": function(a, b) { 
     var sa = a.toString(); 
     if(sa.length > 0) { 
      // Don't know why, isDigit(sa.charAt[0]) doesn't work?? 
      var ca = sa.substring(0,1); 
      if(ca === "0" || ca === "1" || ca === "2" || ca === "3" || ca === "4" || ca === "5" || ca === "6" || ca === "7" || ca === "8" || ca === "9") { 
      var x1 = parseInt(a.split(' ').join(''), 10); 
      var y1 = parseInt(b.split(' ').join(''), 10); 
      return x1 - y1; 
      } 
     } 
     var x = a.toLowerCase(); 
     var y = b.toLowerCase(); 
     return ((x < y) ? -1 : ((x > y) ? 1 : 0)); 
    }, 

    "string-desc": function(a, b) { 
     var sa = a.toString(); 
     if(sa.length > 0) { 
      var ca = sa.substring(0,1); 
      if(ca === "0" || ca === "1" || ca === "2" || ca === "3" || ca === "4" || ca === "5" || ca === "6" || ca === "7" || ca === "8" || ca === "9") { 
       var x1 = parseInt(a.split(' ').join(''), 10); 
       var y1 = parseInt(b.split(' ').join(''), 10); 
       return y1 - x1; 
      } 
     } 
     var x = a.toLowerCase(); 
     var y = b.toLowerCase(); 
     return ((x < y) ? 1 : ((x > y) ? -1 : 0)); 
    }, 
0

對任何人的號碼之間讀這篇文章,希望完整的答案空間:

jQuery.extend(jQuery.fn.dataTableExt.oSort, { 
     "formatted_numbers-pre": function (a) { 
     a = (a===" ") ? 0 : a.replace(/[^\d\-\.]/g, ""); 
     return parseFloat(a); 
     }, 

     "formatted_numbers-asc": function (a, b) { 
     return a - b; 
     }, 

     "formatted_numbers-desc": function (a, b) { 
     return b - a; 
     } 
    }); 

    $('.myTable').DataTable({ 
     "columnDefs": [ 
     { "type": "formatted_numbers", "targets": 4 } 
     ], 
    }); 
    } 
0

只需設置小數點時建立數據表是這樣的:

var main_table = $('#main_list').DataTable({ 
    ajax: { 
     url: "/api/your/data", 
     dataSrc: '' 
    }, 
    columns: [ 
     { data: "Col1" }, 
     { data: "Col2" }, 
     { data: "Col3" }, 
     { data: "Col4" } 
    ], 
    language: { 
     /* -----> */ "decimal": ",", // <--------- 
     "emptyTable": "Keine Daten in der Tabelle verfügbar", 
     "info": "Anzeigen von _START_ bis _END_ von _TOTAL_ Einträgen", 
     "infoEmpty": "Anzeigen von 0 bis 0 von 0 Einträgen", 
     "infoFiltered": "(filtriert von_MAX_ Gesamteinträge)", 
     "infoPostFix": "", 
     /* -----> */ "thousands": ".", // <--------- 
     "lengthMenu": "_MENU_ Einträge anzeigen", 
     "loadingRecords": "Laden...", 
     "processing": "Verarbeitung...", 
     "search": "Suche:", 
     "zeroRecords": "Keine passenden Datensätze gefunden", 
     "paginate": { 
      "first": "Erste", 
      "last": "Letzte", 
      "next": "Nächste", 
      "previous": "Vorherige" 
     }, 
     "aria": { 
      "sortAscending": ": aufsteigend sortieren", 
      "sortDescending": ": absteigend sortieren" 
     } 
    }, 
    columnDefs: [ 
     {//set german formatting 

      render: function (data, type, row) { 
       return formatDE(data,2); 
      }, 
      targets: [2, 4, 5] 
     }, 
     { 

      render: function (data, type, row) { 
       return formatDE(data,0); 
      }, 
      targets: [3] 
     } 
    ], 
    pageLength: 50}); 

如果你挖多進jquery.dataTables.js,你會發現他們有它決定每列的類型的函數價值和捕獲的格式

相關問題