jQuery tablesorter - столбец без сортировки с отформатированным значением валюты

Плагин jQuery 1.7.1 и tablesorter. У меня есть столбец валюты с разделителями тысяч и такими значениями, как 52,00 $ 26,70 $ 100,00 $ 50,00 $ 1002,00 $ 1102,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

Пробовал много решений, упомянутых здесь, но безуспешно.


person SyAu    schedule 27.01.2012    source источник
comment
Почему бы вам не удалить запятые, а затем добавить их обратно?   -  person Joseph Silber    schedule 27.01.2012
comment
@JosephSilber Не знаю, как это сделать. Спасибо.   -  person SyAu    schedule 27.01.2012
comment
Проверь это. Это режим ЕС, но вы сможете понять это: > stackoverflow.com/questions/3403726/   -  person Brent Anderson    schedule 27.01.2012
comment
@SyAu - Чтобы удалить запятые, просто используйте str.replace(/,/g, ''). Чтобы добавить их обратно, см. >мой ответ здесь.   -  person Joseph Silber    schedule 27.01.2012
comment
@BrentAnderson Я перешел по этой ссылке и нашел исправление, см. Мои комментарии под принятым ответом ниже.   -  person SyAu    schedule 27.01.2012


Ответы (4)


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

Возможно, вам придется настроить функцию форматирования, которую я не тестировал.

person Beetroot-Beetroot    schedule 27.01.2012
comment
Я проверил ваше решение, оно работает. Спасибо. Я выбрал ваш ответ как принятый. У меня есть много страниц со значением валюты, как указано выше, поэтому я поместил исправление в jquery.tablesorter.min.js в функции формата ts.addParser({id:currency ... with s=s.replace(',' , ''); как предложено здесь, спасибо "Брент Андерсон" за это. Спасибо «Джозеф Зильбер» и за ваше предложение. - person SyAu; 27.01.2012
comment
это не работает с несколькими символами "." или ",", т.е. 9.2 (92) › 2.2.9 (229) - person Blowsie; 08.10.2012
comment
@Blowsie, это неудивительно, поскольку данные больше не соответствуют правилам форматирования «тысячи». Вам нужно будет разработать синтаксический анализатор для обработки ваших данных. - person Beetroot-Beetroot; 08.10.2012

Если вы просто хотите исправить номера валют (самый быстрый):

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

  1. «Использовать пользовательский синтаксический анализатор и применить его к таблице sort init» — нельзя повторно использовать для таблиц лотов.
  2. «Использовать пользовательский синтаксический анализатор и применить его к классу ячейки таблицы» — грязная разметка
  3. «Исправить сортировку валюты TableSorters в исходном коде» — проблема для будущих обновлений
person Owen    schedule 02.07.2012
comment
Это именно то, что я искал. Спасибо !! - person gav.newalkar; 10.03.2014
comment
Если вы хотите добавить кг в этот текст, извлечение создает ошибку для остальных столбцов, когда вы пытаетесь отфильтровать по букве г. Столбец не сможет отфильтровать это g. Поэтому я бы порекомендовал решение addParser сверху. - person Ricard Espinàs Llovet; 26.06.2018

Если вы хотите исправить все типы данных (наиболее гибкий):

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

Преимущество этого заключается в отделении отображаемых данных от данных сортировки, что делает их более пригодными для повторного использования.

person Owen    schedule 02.07.2012

Следуя той же идее, предложенной @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'
    }
});
person Gilberto Torrezan    schedule 20.10.2016