3

要求
我的表可以有这样的值 -

1.00
0.00
23.10
-
35.00
-
22.00
0.00
0.00

我希望它像这样排序(所有连字符都应该放在最后) -

1.00
22.00
23.10
35.00
0.00
0.00
0.00
-
-

或者即使这样也可以(开头的所有连字符,至少它们与其他连字符是分开的) -

-
-
0.00
0.00
0.00
1.00
22.00
23.10
35.00

我所做
的我正在使用这样的自定义排序器(这是我们在项目中使用的排序器,它对于整数和十进制数字,即浮点类型非常有效) -

$.tablesorter.addParser({
        // set a unique id
        id: 'formattedNumbers',
        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(/,/g, '').replace(/%/g, ''); //removes comma separator from formatted numbers

        },
        // set type, either numeric or text
        type: 'numeric'
    });

并这样称呼它-

$("#"+report_type).tablesorter({
                    indexing: true,
                    textExtraction: 'complex',
                    headers : 1: {
                                        { sorter: 'formattedNumbers' },
                                    },
                    widgets :['zebra'],
                    sortList:[[0,0]]
                });

结果我得到了
但是我得到了不可预知的结果。0.00 和连字符 (-) 以外的数字在它们之间得到正确排序,但一些 0.00 和连字符仍然随机分散。像这样 -

0.00
1.00
22.00
0.00
-
23.10
-
35.00
0.00
-

我的想法

我们需要更改自定义排序器内部的逻辑以处理连字符。我尝试按照 jQuery tablesorter 中的建议寻找自然排序- 对包含混合文本和数字的列进行排序,但没有找到像我们的“formattedNumbers”这样的任何有效的自定义排序器。

4

4 回答 4

1

tablesorter 的默认排序方法会给你

0.00
0.00
0.00
1.00
22.00
23.10
35.00
-
-

或者

-
-
35.00
23.10
22.00
1.00
0.00
0.00
0.00

看看这里:http: //jsfiddle.net/Y6eMv/2/

我不明白获得该结果的目标:

1.00
22.00
23.10
35.00
0.00
0.00
0.00
-
-

可以详细说明您要实现的目标吗?

于 2013-09-27T13:27:32.983 回答
1

由于没有共享 HTML,我们只能假设标记中的连字符不包含额外的空格、制表符或其他不可见字符。tablesorter 解析器设置为“numeric”,但正在返回一个字符串,因此比较可能不正确。

正如@Xiaodoudou 在jsFiddle 示例中所示,我的tablesorter fork将对连字符进行正确排序。

此外,您可以在列的底部对非数字数据(字符串)进行排序 - 请参阅此演示。不需要额外的解析器,您需要做的就是sort-bottom在列中添加一个类<th>- 试试这个演示

<th class="string-bottom">Numeric</th>
于 2013-09-27T17:34:59.237 回答
1

朋友,请更改您的添加解析器代码。

旧代码

format: function(s){
            // format your data for normalization
                return s.replace(/,/g, '').replace(/%/g, ''); //removes comma separator from formatted numbers

            }

在Mottie给出的建议之后。

更新代码

format: function(s){
            // format your data for normalization
                s = s.replace(/,/g, '').replace(/%/g, ''); //removes comma, percentage 
                if(s && s.trim() && s.trim().length==1){
                       s = s.replace(/-/g,'');                  
                   }
                return s;
    }

希望,这将解决您的问题。在您给出的场景中(值包含更多零并且没有出现负数),为了使其看起来更漂亮,您可以将“-”替换为 -1 以将其与零分开。

更新版本(如果您确定不会有数据<0):

format: function(s){
            // format your data for normalization
                s = s.replace(/,/g, '').replace(/%/g, ''); //removes comma, percentage 
                if(s && s.trim() && s.trim().length==1){
                       s = s.replace(/-/g,'-1');                  
                   }
                return s;
    }

干杯。

于 2013-09-27T15:16:32.190 回答
0

你可以做数组并使用排序方法:

tab.sort(function(a,b){ 
    if(b==0){
      return -1
    }
    else if(a==0){
      return 1
    }
    else{
      return (a-b)
    }
})
于 2013-10-01T13:41:50.447 回答