2012-01-27 24 views
22

jQuery 1.7.1 & plug-in tablesorter - Ho una colonna di valuta con migliaia di separatori e valori come $ 52,00 $ 26,70 $ 100,00 $ 50,00 $ 1,002,00 $ 1,102.00. Quando cerco di ordinare sempre ordinato nel modo seguente,jQuery tablesorter - Non ordinamento colonna con valore di valuta formattato

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

bisogno di valori come,

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

provato molte soluzioni di cui qui, ma senza successo.

+0

Perché non rimuovere le virgole, quindi aggiungere di nuovo in? –

+0

@JosephSilber Non sei sicuro di come farlo. Grazie. – SyAu

+0

Controlla questo. È la modalità EU ma sarai in grado di capirlo: http://stackoverflow.com/questions/3403726/jquery-tablesorter-plugin-comma-decimals –

risposta

29

Tablesorter consente di definire "custom parsers" per cose come questa.

// 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' 
      } 
     } 
    }); 
}); 

Potrebbe essere necessario modificare la funzione di formattazione, che non ho testato.

+0

Ho testato la tua soluzione, funziona. Grazie. Ho selezionato la tua risposta come accettata. Ho molte pagine con valore di valuta come sopra, quindi ho inserito una correzione nel file jquery.tablesorter.min.js nella funzione di formato di ts.addParser ({id: "currency" ... con s = s.replace (',', ''); come proposto [qui] (http://stackoverflow.com/questions/3403726/jquery-tablesorter-plugin- virgola-decimali), grazie a 'Brent Anderson' per questo.Grazie 'Joseph Silber' per il tuo suggerimento pure. – SyAu

+0

questo fallisce con multipli '.'s o', 's cioè 9.2 (92)> 2.2.9 (229) – Blowsie

+0

@Blowsie, non è una grande sorpresa dato che i dati non sono più conformi alle regole di formattazione "migliaia" Dovresti sviluppare un parser per gestire in modo specifico i tuoi dati –

23

Se si desidera solo per fissare il numero di valuta (più veloce):

<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> 

Non mi piacciono questi 3 altre soluzioni proposte su StackOverflow:

  1. 'Usa parser personalizzato e si applicano nei table sort init '- non riutilizzabile per le tabelle lotti
  2. ' Utilizza parser personalizzato e applica con classe cella di tabella '- markup sporco
  3. ' Correzione di ordinamento di TableSorters nella fonte '- seccatura per gli aggiornamenti futuri
+1

Questo è brillante – Cypher

+0

Questo è esattamente quello che stavo cercando. !! –

+0

L'ordinamento in asc non funziona per qualche motivo – user1012181

15

Se si vuole risolvere tutti i tipi di dati (più flessibili):

<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> 

Questo ha il vantaggio di separare i dati di visualizzazione dai dati di ordinamento, più riutilizzabili.

+0

Davvero fantastico! –

0

Seguendo la stessa idea proposta da @Ownen, dal tablesorter v2.16.0, è possibile utilizzare l'attributo data-text direttamente, senza la necessità di dichiarare il proprio textExtraction funzione (+ info here):

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

Questo l'attributo funziona anche con altri widget, come math.

Nota: al fine di farlo funzionare con la output widget, è necessario dichiarare l'opzione output_dataAttrib:

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