2012-01-27 7 views
22

jQuery 1.7.1 & wtyczka tablesorter - Posiadam kolumnę walut z tysiącami separatorów i wartościami takimi jak 52,00 $ 26,70 $ 100,00 $ 50.00 1 002,00 $ 1 102,00 $. Kiedy próbuję uporządkować coraz klasyfikowane w następujący sposóbjQuery tablesorter - Nie sortowanie kolumny ze sformatowaną wartością waluty

$1,002.00 
    $1,102.00 
    $26.70 
    $50.00 
    $52.00 
    $100.00 

Need wartości jak,

$26.70 
    $50.00 
    $52.00 
    $100.00 
    $1,002.00 
    $1,102.00 

próbowali wielu rozwiązań wymienionych tutaj, ale bez powodzenia.

+0

Dlaczego nie można usunąć przecinków, a następnie dodać je z powrotem? –

+0

@JosephSilber Nie wiesz, jak to zrobić. Dzięki. – SyAu

+0

Sprawdź to. Jest to tryb EU, ale będziesz mógł to zrozumieć: http://stackoverflow.com/questions/3403726/jquery-tablesorter-plugin-comma-decimals –

Odpowiedz

29

Tablesorter pozwala zdefiniować "custom parsers" dla takich rzeczy.

// add parser through the tablesorter addParser method 
$.tablesorter.addParser({ 
    // set a unique id 
    id: 'thousands', 
    is: function(s) { 
     // return false so this parser is not auto detected 
     return false; 
    }, 
    format: function(s) { 
     // format your data for normalization 
     return s.replace('$','').replace(/,/g,''); 
    }, 
    // set type, either numeric or text 
    type: 'numeric' 
}); 

$(function() { 
    $("table").tablesorter({ 
     headers: { 
      6: {//zero-based column index 
       sorter:'thousands' 
      } 
     } 
    }); 
}); 

Może być konieczne zmodyfikowanie funkcji formatu, której nie testowałem.

+0

Przetestowałem twoje rozwiązanie, działa. Dzięki. Wybrałem twoją odpowiedź jako zaakceptowaną. Mam wiele stron z wartością waluty jak wyżej, więc poprawiłem plik jquery.tablesorter.min.js w funkcji formatowania ts.addParser ({id: "currency" ... with s = s.replace (',', ''), zgodnie z propozycją [tutaj] (http://stackoverflow.com/questions/3403726/jquery-tablesorter-plugin- comma-decimals), dziękuję za to "Brentowi Andersonowi" Dziękuję za sugestię "Joseph Silber" – SyAu

+0

to kończy się niepowodzeniem z wieloma znakami "." lub ", tj. 9.2 (92)> 2.2.9 (229) – Blowsie

+0

@Blowsie, to nie jest żadna niespodzianka, ponieważ dane nie są już zgodne z regułami formatowania "tysięcy" .Trzeba opracować parser, aby w szczególności obsługiwać dane –

23

Jeśli chcesz tylko naprawić numery walutami (najszybsza):

<script type="text/javascript"> 
    $("table").tablesorter({ 
     textExtraction: function(node){ 
      // for numbers formattted like €1.000,50 e.g. Italian 
      // return $(node).text().replace(/[.$£€]/g,'').replace(/,/g,'.'); 

      // for numbers formattted like $1,000.50 e.g. English 
      return $(node).text().replace(/[,$£€]/g,''); 
     } 
    }) 
</script> 

<td><span>£80,000.00</span></td> 

nie lubię tych 3 innych proponowanych rozwiązań na StackOverflow:

  1. „Użyj niestandardowego parsera i zastosować w table sort init '- nie nadaje się do użytku z tabelami partyjnymi
  2. ' Użyj niestandardowego analizatora składni i zastosuj z klasą komórki tabeli '- zabrudzony znacznik
  3. "Napraw sortowanie walutowe w usłudze TableSorters '- uciążliwe dla przyszłych uaktualnień
+1

To jest genialne. – Cypher

+0

To jest dokładnie to, czego szukałem. !! –

+0

Sortowanie w asc nie działa z jakiegoś powodu – user1012181

15

Jeśli chcesz naprawić wszystkie typy danych (najbardziej elastycznych):

<script type="text/javascript"> 
    $(function() { 
     $("table").tablesorter({ 
      textExtraction: function(node){ 
       var cell_value = $(node).text(); 
       var sort_value = $(node).data('value'); 
       return (sort_value != undefined) ? sort_value : cell_value; 
      } 
     }) 
    }) 
</script> 

<td data-value="2008-04-01">01 Apr 2008</td> 
<td>Alice</td> 
<td data-value="80.00"><span>£80.00</span></td> 

Ma to tę zaletę, oddzielając wyświetlania danych z danymi rodzaju, bardziej wielokrotnego użytku.

+0

Naprawdę niesamowite! –

0

Po tej samej idei zaproponowanej przez @Ownen, ponieważ tablesorter v2.16.0, można użyć atrybutu data-text bezpośrednio, bez konieczności zadeklarować swoją textExtraction funkcji (więcej informacji here):

<td data-text="2008-04-01">01 Apr 2008</td> 
<td>Alice</td> 
<td data-text="80.00"><span>£80.00</span></td> 

ten atrybuty działają również z innymi widżetami, takimi jak math.

Uwaga: w celu uczynienia go pracy z output widget, trzeba zadeklarować opcję output_dataAttrib:

$('#table').tablesorter({ 
    widgets: ["output"], 
    widgetOptions : { 
     output_dataAttrib: 'data-text' 
    } 
});