JQuery tablesorter - Не сортировать столбец с форматированным значением валюты
jQuery 1.7.1 и плагин tablesorter - у меня есть столбец валюты с тысячами разделителей и значения, такие как $52.00 $26.70 $100.00 $50.00 $1,002.00 $1,102.00. Когда я пытаюсь сортировать сортировку следующим образом,
$1,002.00
$1,102.00
$26.70
$50.00
$52.00
$100.00
Нужны значения, например,
$26.70
$50.00
$52.00
$100.00
$1,002.00
$1,102.00
Пробовал много решений, упомянутых здесь, но без успеха.
Ответы
Ответ 1
Tablesorter позволяет вам определить пользовательские парсеры для таких вещей.
// 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'
}
}
});
});
Возможно, вам придется настроить функцию формата, которую я не тестировал.
Ответ 2
Если вы просто хотите исправить номера валют (быстрее):
<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>
Мне не нравятся эти 3 других предложенных решения в StackOverflow:
- 'Использовать собственный парсер и применять его в таблице сортировки init' - не использовать повторно для таблиц лотов
- 'Использовать собственный парсер и применять его с классом ячейки таблицы' - грязная разметка
- 'Fix TableSorters сортировать валюту в источнике' - хлопот для будущих обновлений
Ответ 3
Если вы хотите исправить все типы данных (наиболее гибкие):
<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>
Это имеет преимущество, заключающееся в разделении отображаемых данных из данных сортировки, более многоразовых.
Ответ 4
Следуя той же идее, предложенной @Ownen, поскольку TableSorter v2.16.0, вы можете напрямую использовать атрибут data-text
, без необходимости объявлять свою собственную функцию textExtraction
(подробнее здесь):
<td data-text="2008-04-01">01 Apr 2008</td>
<td>Alice</td>
<td data-text="80.00"><span>£80.00</span></td>
Этот атрибут работает и с другими виджетами, например math.
Примечание. Чтобы заставить его работать с выходным виджем, вам нужно объявить опцию output_dataAttrib
:
$('#table').tablesorter({
widgets: ["output"],
widgetOptions : {
output_dataAttrib: 'data-text'
}
});