2012-01-27 11 views
22

jQuery 1.7.1 & plugin tablesorter - Tengo una columna de moneda con miles de separadores y valores como $ 52.00 $ 26.70 $ 100.00 $ 50.00 $ 1,002.00 $ 1,102.00. Cuando intento para ordenar conseguir ordenados de la siguiente manera,jQuery tablesorter - No ordena la columna con el valor de moneda formateado

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

necesitan valores como,

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

muchas soluciones probadas mencionados aquí, pero sin éxito.

+0

¿Por qué no eliminar las comas, a continuación, añadir de nuevo en? –

+0

@JosephSilber No estoy seguro de cómo hacer eso. Gracias. – SyAu

+0

Mira esto. Es el modo UE, pero podrá resolverlo: http://stackoverflow.com/questions/3403726/jquery-tablesorter-plugin-comma-decimals –

Respuesta

29

Tablesorter le permite definir "custom parsers" para cosas como esta.

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

Es posible que tenga que modificar la función de formato, que no he probado.

+0

He probado su solución, funciona. Gracias. He seleccionado tu respuesta como aceptada. Tengo muchas páginas con valor de moneda como el anterior, así que puse una corrección en jquery.tablesorter.min.js bajo la función de formato de ts.addParser ({id: "currency" ... con s = s.replace (',', ''); como se propone [aquí] (http://stackoverflow.com/questions/3403726/jquery-tablesorter-plugin- coma-decimales), gracias 'Brent Anderson' por esto. Gracias 'Joseph Silber' por su sugerencia. – SyAu

+0

esto falla con múltiples '.' s o ',' es decir 9.2 (92)> 2.2.9 (229) – Blowsie

+0

@Blowsie, eso no es una gran sorpresa ya que los datos ya no se ajustan a las reglas de formato de 'miles'. Tendría que desarrollar un analizador para manejar específicamente sus datos –

23

Si lo que desea es fijar los números de moneda (lo más rápido):

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

No me gustan estas otras 3 propuestas de solución en StackOverflow:

  1. 'uso analizador personalizado y aplicarlo en el table sort init '- no reutilizable para tablas de lotes
  2. ' Usar analizador personalizado y aplicar con clase de celda de tabla '- marcado sucio
  3. ' Fix TableSorters tipo de moneda en origen '- molestia para futuras actualizaciones
+1

Esto es brillante – Cypher

+0

Esto es exactamente lo que estaba buscando. Gracias ! –

+0

Ordenar en asc no funciona por alguna razón – user1012181

15

Si desea corregir todos los tipos de datos (más flexibles):

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

Esto tiene la ventaja de separar los datos de visualización de los datos, ordenar más reutilizables.

+0

¡Realmente increíble! –

0

Siguiendo la misma idea propuesta por @Ownen, ya TableSorter v2.16.0, puede utilizar el atributo data-text directamente, sin la necesidad de declarar su propia función textExtraction (más información here):

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

Este También funciona el atributo con otros widgets, como math.

Nota: con el fin de hacer que funcione con el output widget, tiene que declarar la opción output_dataAttrib:

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