Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery jqGrid-自定义排序函数-对数字和文本进行排序_Jquery_Excel_Sorting_Jqgrid - Fatal编程技术网

Jquery jqGrid-自定义排序函数-对数字和文本进行排序

Jquery jqGrid-自定义排序函数-对数字和文本进行排序,jquery,excel,sorting,jqgrid,Jquery,Excel,Sorting,Jqgrid,在网页上使用jqGrid 4.5.3,我的数据可以是文本或数字。我在列上使用了一个自定义排序函数,但它没有按照我期望的排序方式进行排序 我在网格中的行中有以下数据,这是它们发送的顺序: 123 654 321 Test James 如果我将相同的数据放入Excel并进行排序,顺序(从最小到最大)为: 如果我在Excel中按从大到小的顺序再次排序,则为: Test James 654 321 123 在我的jQgrid中,顺序总是先有文本,然后是数字。两者的顺序都正确(在它们之间),但文本始终

在网页上使用jqGrid 4.5.3,我的数据可以是文本或数字。我在列上使用了一个自定义排序函数,但它没有按照我期望的排序方式进行排序

我在网格中的行中有以下数据,这是它们发送的顺序:

123
654
321
Test
James
如果我将相同的数据放入Excel并进行排序,顺序(从最小到最大)为:

如果我在Excel中按从大到小的顺序再次排序,则为:

Test
James
654
321
123
在我的jQgrid中,顺序总是先有文本,然后是数字。两者的顺序都正确(在它们之间),但文本始终位于网格的顶部。自定义排序的代码为:

function myCustSort (myCell, rowObj ) {
    var n = myCell.length;
    var intRegex = /^\d+$/ ;
    var checkNumeric;
    checkNumeric = intRegex.test(myCell);
    if (typeof myCell === "string") {
        if ( checkNumeric === true) {
            return parseInt( myCell);
            }
        else {
            return myCell;
            }
        }
    else {
        return myCell;
        }
} // end myCustSort
正在排序的列的
colModel
为:

{name:"TestData",
index:"TestData",
width:30,
align:"center", 
sorttype: function (cell, obj ) {
        return myCustSort (cell) ;
        },
xmlmap:"Rowset>Row>TestData"
},
我在自定义排序函数中有显示,它正确地将数字计算为数字,将字符串计算为字符串,但是,我无法使它以Excel中相同数据的方式进行排序

我已经看了几个jqGrid自定义排序函数的例子,但是它们调用了一个网格数据的自定义排序,它通过单元格数据的子字符串进行排序。我还没有找到一个被排序的数据是数字和文本的混合体


如果此列的自定义排序函数中缺少某些内容,请告诉我。谢谢

我能够解决我遇到的问题(文本总是在顶部,以及其他奇怪的排序结果)。事实证明,有几件事情同时发生,我相信这一切都促成了网格中数据排序的行为

第一个问题是网格的
sortname
。我最初是根据一个ID编号对其进行排序的,在更改过程中,我将其更改为一个隐藏字段。我更改了存储过程和代码,以按照显示的日期时间字段对SQL中的数据进行排序,并在网格上进行排序。这一变化解决了我所得到的奇怪的排序问题,网格中会多次出现相同的数字——无序

第二个变化是自定义排序函数。我的数据有三个可能的特征之一:

  • 它可能是一个3位数的数字
  • 它可以是一个4位数的数字,或者
  • 它可以是一个包含名称或文本的字符串
  • 我可以在函数中显示,看到它正确地计算了长度,正确地解释了数据的特征

    然后,我重新编写了自定义排序函数,如下所示:

    function myCustSort (myCell, options, rowObj ) {
        var n = myCell.length;
        var intRegex = /^\d+$/ ;
        var checkNumeric;
        checkNumeric = intRegex.test(myCell);
        if (typeof myCell === "string") {
            var myIntStr;
            if ( checkNumeric === true) {
                if ( n === 3 ) {
                    myIntStr = "0" + parseInt( myCell);
                    }
                else {
                    myIntStr = "0" + parseInt( myCell);
                    myIntStr = myIntStr.substring(1);
                    }
                }
            else {
                myIntStr = myCell;
                }
            return myIntStr;
            }
        else {
            return myCell;
            }
    } // end myCustSort
    

    现在,文本和数字的排序都正确了(所以在2之前我没有10和1000)。多亏了@Oleg,我读了几次他关于这个主题的帖子,试图调试我的排序函数有什么问题

    如果您的文本值有前缀,并且您有数字,下面的自定义函数将有所帮助

    function myCustSort(myCell, options, rowObj) {
    var n = myCell.length;
    var intRegex = /^\d+$/;
    var checkNumeric;
    checkNumeric = intRegex.test(myCell);
    if (typeof myCell === "string") {
        var myIntStr;
        if (checkNumeric === true) {
    
            if (n === 9) {
                myIntStr = "0" + parseInt(myCell);
            }
            else if (n === 8) {
                myIntStr = "00" + parseInt(myCell);
            }
            else if (n === 7) {
                myIntStr = "000" + parseInt(myCell);
            }
            else if (n === 6) {
                myIntStr = "0000" + parseInt(myCell);
            }
            else if (n === 5) {
                myIntStr = "00000" + parseInt(myCell);
            }
            else if (n === 4) {
                myIntStr = "000000" + parseInt(myCell);
            }
            else if (n === 3) {
                myIntStr = "0000000" + parseInt(myCell);
            }
            else if (n === 2) {
                myIntStr = "00000000" + parseInt(myCell);
            }
            else {
                myIntStr = "000000000" + parseInt(myCell);
            }
        }
        else {
    
            var isChecktype = myCell.indexOf("PREFIX");
            if (isChecktype <= -1)  {
                var odvalue = myCell.split('PREFIX');
                var odlength = odvalue[1].length;
    
                if (odlength === 3) {
                    myIntStr = "PREFIX" + "0" + parseInt(odvalue[1]);
                }
                else if (odlength === 2) {
                    myIntStr = "PREFIX" + "00" + parseInt(odvalue[1]);
                }
                else {
                    myIntStr = "PREFIX" + "000" + parseInt(odvalue[1]);
                }
            }
    
    
        }
        return myIntStr;
    }
    else {
    
        return myCell;
    }
    } 
    
    函数myCustSort(myCell,options,rowObj){
    var n=菌丝体长度;
    var intRegex=/^\d+$/;
    var校验数值;
    checkNumeric=intRegex.test(myCell);
    如果(myCell的类型==“字符串”){
    var-myIntStr;
    if(checkNumeric===true){
    如果(n==9){
    myIntStr=“0”+parseInt(myCell);
    }
    else if(n==8){
    myIntStr=“00”+parseInt(myCell);
    }
    else如果(n==7){
    myIntStr=“000”+parseInt(myCell);
    }
    else如果(n==6){
    myIntStr=“0000”+parseInt(myCell);
    }
    else如果(n==5){
    myIntStr=“00000”+parseInt(myCell);
    }
    else如果(n==4){
    myIntStr=“000000”+parseInt(myCell);
    }
    else如果(n==3){
    myIntStr=“0000000”+parseInt(myCell);
    }
    else if(n==2){
    myIntStr=“00000000”+parseInt(myCell);
    }
    否则{
    myIntStr=“000000000”+parseInt(myCell);
    }
    }
    否则{
    var isChecktype=myCell.indexOf(“前缀”);
    if(isChecktype
    
    function myCustSort(myCell, options, rowObj) {
    var n = myCell.length;
    var intRegex = /^\d+$/;
    var checkNumeric;
    checkNumeric = intRegex.test(myCell);
    if (typeof myCell === "string") {
        var myIntStr;
        if (checkNumeric === true) {
    
            if (n === 9) {
                myIntStr = "0" + parseInt(myCell);
            }
            else if (n === 8) {
                myIntStr = "00" + parseInt(myCell);
            }
            else if (n === 7) {
                myIntStr = "000" + parseInt(myCell);
            }
            else if (n === 6) {
                myIntStr = "0000" + parseInt(myCell);
            }
            else if (n === 5) {
                myIntStr = "00000" + parseInt(myCell);
            }
            else if (n === 4) {
                myIntStr = "000000" + parseInt(myCell);
            }
            else if (n === 3) {
                myIntStr = "0000000" + parseInt(myCell);
            }
            else if (n === 2) {
                myIntStr = "00000000" + parseInt(myCell);
            }
            else {
                myIntStr = "000000000" + parseInt(myCell);
            }
        }
        else {
    
            var isChecktype = myCell.indexOf("PREFIX");
            if (isChecktype <= -1)  {
                var odvalue = myCell.split('PREFIX');
                var odlength = odvalue[1].length;
    
                if (odlength === 3) {
                    myIntStr = "PREFIX" + "0" + parseInt(odvalue[1]);
                }
                else if (odlength === 2) {
                    myIntStr = "PREFIX" + "00" + parseInt(odvalue[1]);
                }
                else {
                    myIntStr = "PREFIX" + "000" + parseInt(odvalue[1]);
                }
            }
    
    
        }
        return myIntStr;
    }
    else {
    
        return myCell;
    }
    }