jQuery tablesorter排序格式化的货币

时间:2015-01-07 19:49:57

标签: javascript django sorting tablesorter

编辑,基于Mottie答案的新代码:

jQuery.tablesorter.addParser({
    id: "monetaryValue",
    is: function (s) {
        return false;
    }, format: function (s) {
        return s.replace('$','').replace(/,/g,'');
    }, type: "numeric"
});
var tablezor = jQuery(".tablesorter");
tablezor.tablesorter({
        headers: {
            4 : { sorter: "monetaryValue" }
        },
        sortList: [[7,0]]
});

和HTML:

<table class="tablesorter">
<thead>
    <tr>
        ...
        <th>Processing Fees</th>
        ...
    </tr>
</thead>
<tbody>
{% for cs in customer_stats %}
    <tr class="js_striped">
        ...
        <td>
            <script>
                var options = {style:"currency", currency:"USD", minimumFractionDigits: 2,maximumFractionDigits: 2};
                document.write(new Intl.NumberFormat("en-US", options).format({{ customer_stats[cs]['processing_fee'] }}));
            </script>
        </td>
        ....
    </tr>
{% endfor %}
</tbody>
</table>

我已经尝试了十几个例子来解决这个问题,但没有任何工作。

我正在使用jQuery.tablesorter对表进行排序,当我将数字格式化为货币时,货币列将无法正确排序(美元,格式为$ 1,945.00)

这是一个Django模板,模板变量呈现为无格式的数字,如1945.0,所以我需要使用javascript添加格式。我想使用Humanize模板过滤器库,但我们使用的是没有它的Jinja。我需要在客户端上进行格式化,因此python建议可能无法正常工作。

当它只是一个数字时,它排序很好。当我使用一个小脚本标签(是的,我知道这不是最好的方法,它是一个短期的修复,直到我们用Backbone重新编写前端)来将数字格式化为货币,排序不工作。它的排序如下:

$ 3,380.00

$ 350.00

$ 353.24

$ 3,535.24

这是格式化为货币的功能:

function formatDollar(num) {
    var p = num.toFixed(2).split(".");
    return '$' + p[0].split("").reverse().reduce(function(acc, num, i, orig) {
        return  num + (i && !(i % 3) ? "," : "") + acc;
    }, "") + "." + p[1];
}

这是HTML:

<table class="tablesorter">
    <thead>
        <tr>
            ...
            <th class="{sorter:'monetaryValue'}">Processing Fees</th>
            ...
        </tr>
    </thead>
    <tbody>
    {% for cs in customer_stats %}
        <tr class="js_striped">
            ...
            <td>
                <script>
                    var money = formatDollar({{ customer_stats[cs]['processing_fee'] }});
                    document.write(money);
                </script>
            </td>
            ....
        </tr>
    {% endfor %}
    </tbody>
</table>

和tablesorter的自定义解析器:

var tablezor = jQuery(".tablesorter");
tablezor.tablesorter({
        sortList: [[1,1]]
});
tablezor.addParser({
    id: "monetaryValue",
    is: function (s) {
        return false;
    }, format: function (s) {
        return s.replace('$','').replace(/,/g,'');
    }, type: "numeric"
});

随时告诉我这是多么可怕;如果你能告诉我如何让货主正确地对货币进行分类,那么欢迎任何批评。

谢谢,

2 个答案:

答案 0 :(得分:3)

这里的主要问题是需要使用$.tablesorter.addParser()添加解析器,而不是$('.tablesorter').addParser()

jQuery.tablesorter.addParser({
    id: "monetaryValue",
    is: function (s) {
        return false;
    }, format: function (s) {
        var n = parseFloat( s.replace('$','').replace(/,/g,'') );
        return isNaN(n) ? s : n;
    }, type: "numeric"
});
var tablezor = jQuery(".tablesorter");
tablezor.tablesorter({
        headers: {
            0 : { sorter: "monetaryValue" }
        },
        sortList: [[1,1]]
});

如果您使用我的fork of tablesorter,默认(自动检测)货币解析器将使用提供的货币值(demo)。

对于其他国家/地区的货币,只需将usNumberFormat option设置为false

答案 1 :(得分:3)

我的问题的解决方案是在服务器上进行格式化。

这可能是一个教训,不要在我的标记中加入hacky废话。

为了记录,在我的Django视图中,我这样做了:

customer_stats[c['customer']]['processing_fee'] = '${:,.2f}'.format(float(c['processing_fee']))

然后我删除了自定义解析器并使用了它:

tablezor.tablesorter({
    sortList: [[4,1]],
    textExtraction: function(node){ 
        return $(node).text().replace(/[,$£€]/g,'');
     }
});

textExtraction处理解析问题。

再次感谢Mottie的所有努力。