【问题标题】:Sorting Currency in Bootstrap Table在引导表中对货币进行排序
【发布时间】:2015-09-08 23:54:53
【问题描述】:

我想在我的数字中添加货币符号,同时使值在我的引导表中保持可排序(第 30-34 行;表中的第 4 列):

for (var p=0; p<variable_data.length; p++){
    try{
        variable_data[p]["4"] = "$" + Math.round(variable_data[p]["4"])
    } catch(e){ }
}

http://jsfiddle.net/mademoiselletse/s0d1xgzt/

带有“$”的值被排序为字符串而不是数字。我在网上发现的所有货币排序问题都与 DataTable 和 tablesorter() 插件有关。有没有比安装更多 jQuery 插件更快的解决方法?

非常感谢您的帮助!

【问题讨论】:

    标签: javascript jquery twitter-bootstrap sorting bootstrap-table


    【解决方案1】:

    查看自定义示例here

    您需要发送一个data-sorter function,它会从您的字符串中删除 $,然后将其作为数字进行比较。

    【讨论】:

    • 非常感谢您的回复!我在 HTML 第 34 行输入了以下内容:&lt;th data-field="4" data-sorter="priceSorter" data-sortable="true" data-align="center" data-valign="middle"&gt;Leasehackr&lt;br&gt;Estimate &lt;/th&gt; 和我的 javascript 末尾的 priceSorter 脚本(第 246-252 行)但表格没有正确排序。你能给我一些关于我可能做错了什么的指示吗? jsfiddle.net/mademoiselletse/s0d1xgzt/3
    • 在您提供的最后一个链接中,您的排序适用于最后 2 列,我错了吗?
    • 不幸的是,您引用的链接现在是 404。我有一个排序函数触发,但缺少有关如何返回比较值的文档。
    • 这是一个很好的例子,说明为什么只有链接的答案不好。示例应该在答案本身中。见your answer is in another castle
    【解决方案2】:

    遇到了类似的问题,最后从他们的实际网站上查看了自定义排序器示例的源代码:http://issues.wenzhixin.net.cn/bootstrap-table/#options/custom-sort.html

    首先,在定义包含货币/货币/美元值的列时,将 sorter 的引用添加到您要使用的任何 javascript 函数中。这是我的货币列定义的样子:

    [
        "field" => "total",
        "title" => "Total",
        "sortable" => true,
        "sorter" => "totalCurrencySort"
    ]
    

    之后,您需要创建在对特定列进行排序时执行的 javascript 函数。这里我们定义 totalCurrencySort 可以接受 4 个参数,但只需要前两个。

    function totalCurrencySort(a, b, rowA, rowB) {  
        a = +a.substring(1); // remove $
        b = +b.substring(1);
        if (a > b) return 1;
        if (a < b) return -1;
        return 0;
    }
    

    为了进行正确的比较,“$”被删除——根据需要——并且数值计算确定两个值之间的正确排序状态并相应地返回。 rowN 引用提供了行的完整数据集,以防您的自定义排序逻辑需要使用行内的其他数据进行更复杂的计算。

    【讨论】:

      【解决方案3】:

      我太新了,无法评论 Art 的帖子,但想为对我有用的内容添加注释。 Art 帖子中的 totalCurrencySort 函数对我有用。在表头中,我将属性设置为 data-sorter(而不仅仅是 sorter)。

      function totalCurrencySorter(a, b, rowA, rowB) {
      a = +a.substring(1);  // remove $
      b = +b.substring(1);
      if (a > b) return 1;
      if (a < b) return -1;
      return 0;
      }
      
      function totalCurrencyFormatter(data) {
      var field = this.field
      return '$' + data.map(function (row) {
      return +row[field].substring(1)
      }).reduce(function (sum, i) {
      return sum + i;
      }, 0)
      }
      
      

      对于 HTML 表格,我的标题一般是这样的:

      <thead>
      <tr>
      <th data-field="id" data-sortable="true">ID</th>
      <th data-field="exp_date" data-sortable="true">Date</th>
      <th data-field="amount" data-sortable="true" formatter="totalCurrencyFormatter" data-sorter="totalCurrencySorter">Amount</th>
      </tr>
      </thead>
      

      【讨论】:

        【解决方案4】:

        为了补充 Art 和 OptimisticToaster 的答案,我也太新了,无法发表评论,所以我对这个问题的看法是:

        function totalCurrencySort(a, b, rowA, rowB) {  
            
            a = Number(a.replace(/[^0-9.-]+/g,""));
            b = Number(b.replace(/[^0-9.-]+/g,""));
            
            if (a > b) return 1;
            if (a < b) return -1;
            return 0;
        }
        

        我正在处理格式为 1,000.50 英镑的数字,因此剥离任何非数字允许排序以任何格式工作。

        【讨论】:

          猜你喜欢
          • 2016-01-07
          • 2013-09-06
          • 2022-07-12
          • 2020-10-20
          • 1970-01-01
          • 2020-05-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多