Jquery jqGrid-自定义排序函数-对数字和文本进行排序
在网页上使用jqGrid 4.5.3,我的数据可以是文本或数字。我在列上使用了一个自定义排序函数,但它没有按照我期望的排序方式进行排序 我在网格中的行中有以下数据,这是它们发送的顺序: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中,顺序总是先有文本,然后是数字。两者的顺序都正确(在它们之间),但文本始终
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中的数据进行排序,并在网格上进行排序。这一变化解决了我所得到的奇怪的排序问题,网格中会多次出现相同的数字——无序
第二个变化是自定义排序函数。我的数据有三个可能的特征之一:
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;
}
}