【问题标题】:alphanumeric zero padding in dataTables?数据表中的字母数字零填充?
【发布时间】:2012-10-07 01:03:46
【问题描述】:

我觉得这有一个“duh”的答案,但是

我正在使用 jQuery 插件 DataTables.net 来显示 json Google 电子表格。你可以在这里看到它的实际效果:http://jsfiddle.net/ukoku/jEqu2/2/

我想按位置列对行进行排序,该列以 A1、B2 格式读取,如国际象棋。对于数字,我知道我需要零填充,但我不知道如何将零添加到字母数字数据,也不知道如何使用 DataTables 而不是常规字符串。

编辑:对不起,我不清楚。我认为需要添加零的位置位于字母字符和位置插槽中的数字之间。例如,目前,Q9 排序在 Q14 之后。我需要它首先按 alpha (Ax, Bx) 排序,然后在该排序中作为数字。通常,当我的 1 显示为高于 10 时,这是因为我需要用零填充来获得 001 和 010。但我不确定如何在 Q009 和 Q014 等的数字之间添加零,或者这甚至是正确的解决方案。

最终,目标是自定义 CSS 以在组中显示具有相同位置的行。老实说,我也不知道这是否可能,但因为我什至无法对数据进行排序......

【问题讨论】:

  • 你想在哪里加零?
  • 如果您可以使用包含您为 Location 列描述的数字类型的数据源更新 jsfiddle 将会很有帮助
  • 已更新,西哈斯。 Geuis:它应该加载一个包含 4 个数据示例的电子表格。

标签: javascript jquery datatables google-sheets


【解决方案1】:

这是你追求的正确轨道吗? http://jsfiddle.net/rMUWD/

【讨论】:

  • 万岁,这似乎确实有效!我看到你把它们变成了数组,但我不太确定你做了什么。如果你有时间,我希望能做一个简短的解释。 (我对术语很模糊。)
  • 在排序函数中,我设置了 4 个变量。我将每个字符串的第一个字符 substr(0,1) 与字符串的其余部分 parseInt(substr(1)) 分开。然后对于实际排序,我首先比较 char-vs-char vars,如果它们匹配,则比较 int vars。希望能解释一下(无论如何我都不是 JS 奇才,但有一些使用数据表库破解东西的经验)。
【解决方案2】:

这是另一种方法:

var compare = function(a, b) {
        return a > b ? 1 : a === b ? 0 : -1;
    },
    compareAlphanumeric = function (a, b) {
        alpha = compare(a.alpha, b.alpha);
        numeric = compare(a.numeric, b.numeric);
        return (alpha === 1 | (alpha === 0 && numeric === 1)) ? 1 : (alpha === 0 && numeric === 0) ? 0 : -1;
    };
jQuery.fn.dataTableExt.oSort['alphaNumeric-asc'] = function(a, b) {
    var r = /^([A-Za-z]+)([0-9]+$)/,
        a = {
            "alpha": a.split(r)[1],
            "numeric": parseInt(a.split(r)[2], 10)
        },
        b = {
            "alpha": b.split(r)[1],
            "numeric": parseInt(b.split(r)[2], 10)
        };
        return compareAlphanumeric(a, b);
};
jQuery.fn.dataTableExt.oSort['alphaNumeric-desc'] = function(a, b) {
    var r = /^([A-Za-z]+)([0-9]+$)/,
        a = {
            "alpha": a.split(r)[1],
            "numeric": parseInt(a.split(r)[2], 10)
        },
        b = {
            "alpha": b.split(r)[1],
            "numeric": parseInt(b.split(r)[2], 10)
        };
        return compareAlphanumeric(b, a); //reverse a and b for desc
};

在这里工作:http://jsfiddle.net/jEqu2/3/

compare 函数是您的基本比较函数。 compareAlphanumeric 根据以下真值表返回 1、0 或 -1:

/*
        Alpha   Numeric     Result
        -1      -1          -1
        -1      0           -1
        -1      1           -1
        0       -1          -1
        0       0           0
        0       1           1
        1       -1          1
        1       0           1
        1       1           1
*/

大部分实际工作是在oSort 函数中完成的:

//First declare a RegExp to split the location into an array of [letter, number] 
var r = /^([A-Za-z]+)([0-9]+$)/,
//convert the passed "a" parameter to an object containing its letter and number,
//and parse the number portion to an actual number instead of its string representation.
    a = {
        "alpha": a.split(r)[1],
        "numeric": parseInt(a.split(r)[2], 10)
    },
//do the same for b
    b = {
        "alpha": b.split(r)[1],
        "numeric": parseInt(b.split(r)[2], 10)
    };
//return the alphanumeric comparison
    return compareAlphanumeric(a, b);

而在降序的oSort中,我们只需要切换传递给compareAlphanumeric的参数顺序即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    • 2017-07-29
    • 2013-08-09
    • 1970-01-01
    相关资源
    最近更新 更多