2012-04-24 21 views
0

我見過一些類似的問題,但在我的案例中沒有正確的答案。我使用DataTables插件對一些表進行排序。如何使用自然排序插件製作工作數據表?

但是我們不能像數字那樣排序數據,而他們不是(nut ;-p)。 例如,我們不能排序格式化的價格像:

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

於是,我就包括DataTables plugin稱爲「Natural sort」。 但它似乎沒有工作,我可能會犯一些錯誤,但我找不到它們。

任何幫助將不勝感激。

所有你需要看/測試:JSfiddle(嘗試列...排序)

回答

2

所以看起來你有兩個問題。首先,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); 
} 

關鍵是刪除空格,句點和歐元符號,以便它可以作爲數字讀取。

+0

謝謝您的回答。我試過了http://jsfiddle.net/DzaQe/2/,但它似乎也不起作用。函數naturalSort(a,b)不做這項工作?你可以在這裏看到示例http://www.overset.com/2008/09/01/javascript-natural-sort-algorithm-with-unicode-support/我認爲插件調用「jQuery.fn .dataTableExt.oSort ['natural -...']「並且不確定{」sType「:」natural「}是否也是正確的語法... – Valky 2012-04-24 21:41:36

+0

該頁面上沒有任何示例對具有數千個分隔符的常規數字進行排序。我看着你的小提琴;你需要'返回testSort(a,b);'而不是調用'testSort'然後'return naturalSort(a,b);'。自從您將千位分隔符從「'」更改爲'.'後,我也更新了我的代碼。 – 2012-04-24 22:08:24

+0

在這裏,我分叉你的小提琴:http://jsfiddle.net/v2L4T/1/使用'testSort'爲價格列,'naturalSort'爲其餘。 – 2012-04-24 22:11:57

1

感謝@Ryan P我的S型的聲明是錯誤的...

Finaly,我需要增加更多的插件,使其工作時,我贊成它,如果它可以幫助別人:

  • 自然排序:用於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; 
}; 
  • 不印字 「空」 類型分爲格式化-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; 
    } 
); 
  • 格式化-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/