我当前正在使用http://datatables.net中的数据表。我有许多列包含“未知”数据(即无法预设内容类型)
在使用数据表之前,这只是一个标准的简单表,其中在服务器端使用ASP.NET/C#/LINQ orderby(常规排序)进行排序,并且几乎可以在任何情况下使用。
现在,使用数据表进行排序主要是错误的。特别是数字以及字符串和数字的混合是错误的。
我的错误情况:
我对这个数据表/ JavaScript世界还很陌生。对于错误情况,我添加了所有我能想到的插件,并且对它们进行了全部测试,但未成功获取正确的列表排序。
我认为我想进行的排序是序数形式(例如ASCII二进制),并且只要我能理解JS如何执行以下操作,就可以实现自己的排序功能:
int c = String.Compare(a, b, StringComparison.Ordinal);
答案 0 :(得分:0)
前一段时间,数据表也面临类似的挑战。这是日期,带格式的数字以及德语的特殊字符。你的名字听起来像你来自斯堪的纳维亚半岛。我想也许对您也很重要...
您需要以下数据表插件来完成所有这些操作:
该时间用于日期时间排序:https://datatables.net/plug-ins/sorting/datetime-moment还需要我强烈推荐的moment.js。 https://momentjs.com/
该字符用于使用特殊字符(例如ä,öü等)的国际分类。 https://datatables.net/plug-ins/sorting/intl
这是用于格式化数字排序的: https://datatables.net/plug-ins/sorting/formatted-numbers
以下示例是有关根据用户语言自动检测各个字段的示例。
实施示例:
这是关于格式化数字。英文格式为1,000,000.99。德语格式为1.000.000,99。它还可以处理空白字段。
//sorting of formatted numbers in English and German format
$.extend( $.fn.dataTable.ext.type.order, {
"formatted-num-pre": function ( a ) {
if (lang == 'de') {
a = a.toString().replace( /[\.]/g, "" );
a = a.toString().replace( /[\,]/g, "." );
} else {
a = a.toString().replace( /[\,]/g, "" );
}
a = a.toString().replace( /[^\d.-]/g, "" );
a = parseFloat(a);
if ( ! isNaN(a) ) {
return a;
} else {
//14 digit negative number to make sure empty cells always stay at the bottom / top
return -99999999999999;
}
},
"formatted-num-asc": function ( a, b ) {
return a - b;
},
"formatted-num-desc": function ( a, b ) {
return b - a;
}
} );
这是关于国际分类的
//sorting:
//Use the phonebook variant of the German sort order,
//which expands umlauted vowels to character pairs: ä → ae, ö → oe, ü → ue.
if (lang === 'de') {
$.fn.dataTable.ext.order.intl("de-DE-u-co-phonebk");
} else {
$.fn.dataTable.ext.order.intl("en-GB");
}
最后这是关于日期排序的:
//should be positioned after the number formatting to make sure
//date columns don't accidentally are assigned formatted-num
//set parms for date sorting using moment.js
$.fn.dataTable.moment( 'L', momentLocale );
在我的示例中,变量momentLocale是'de'或'en-gb'。各自的日期格式为10.11.2018(德语)或10/11/2018(英语)。 (与美国格式的2018年11月10日相反,我认为要求momentLocale为'en')。