如何在Javascript中创建字母数字序列号?

时间:2013-04-01 09:48:18

标签: javascript

我正在尝试在Javascript中创建一个字母数字序列号,序列号由以下规则管理:

  1. 3位数字母数字系列
  2. 允许值1-9(不包括零)和A-Z(所有大写字母排除I和O)
  3. 代码应该能够在获得输入数字后给出下一个数字。
  4. 最后一部分很棘手,基本上代码会获取序列号的现有值,然后它会将输出作为下一个数字。

    例如:如果输入数字11D则输出数字应为11E。如果这个描述足以解释我的要求,请告诉我。

    相同的Excel工作表附有here

    此脚本将获取起始值11D的代码部分来自此代码:

    cur_frm.add_fetch('item_group','serial_number','serial_number');
    

3 个答案:

答案 0 :(得分:3)

这应该这样做:

var nextSerialNumber = function(serialNumber) {
    return (parseInt(serialNumber, 36) + 1).toString(36).replace(
      /i/g,'j').replace(/o/g, 'p').replace(/0/g, '1').toUpperCase();
}

nextSerialNumber("99Z") //=> "9A1"
nextSerialNumber("11D") //=> "11E"

我不确定在ZZZ之后你想要发生什么。它跳转到1111,但可以改变。

如果您输入了无效的序列号(例如11I),则会为您提供下一个有效号码(例如11J)。

答案 1 :(得分:0)

    var alphabet = "123456789ABCDEFGHJKLMNPQRSTUVWXYZ";
    var alphabetLen = alphabet.length;

    function nextDigit(digit) {
        nextDigitPos = (alphabet.indexOf(digit)+1) % alphabetLen;
        return alphabet.charAt(nextDigitPos);
    }

    /**
     * Computes the next serial id.
     * @param id the id to compute the successor of,
     *        if null or empty String the first id
     *        "111" is returned.
     */
    function nextSerial(id) {
        if(id==null || id.length==0) return "111";
        var digits = id.split("");
        digits[2] = nextDigit(digits[2]);
        if(digits[2] == "1") /* overflow */ {
            digits[1] = nextDigit(digits[1]);
            if(digits[1] == "1") /* overflow */ {
                 digits[0] = nextDigit(digits[0])
            }
        }
        return digits.join("");
    }

答案 2 :(得分:0)

这应该这样做:

function getNext(num) {
    var alphabet = "123456789ABCDEFGHJKLMNPQRSTUVWXYZ";
    var digits = num.toUpperCase().split(""),
        len = digits.length,
        increase = true;
    if (len != 3)
        throw new Error("Invalid serial number length in getNext: "+num);
    for (var i=len-1; increase && i>=0; i--) {
        var val = alphabet.indexOf(digits[i]);
        if (val == -1)
            throw new Error("Invalid serial number digit in getNext: "+num);
        val++;
        if (val < alphabet.length) {
            digits[i] = alphabet[val];
            increase = false;
        } else { // overflow
            digits[i] = alphabet[0];
        }
    }
    if (increase) // is still true
        throw new Error("Serial number overflow in getNext");
    num = digits.join("");
    return num;
}

由于您使用的是近字母数字字母,因此基数为33的parseInt / toString也可能已完成。只有您需要“跳过”0IO,这意味着将0,A,B…替换为A,B,C…,将H,I,J…替换为J,K,L… {1}}并将M,N,O…替换为P,Q,R…(以及反序列化后的所有内容) - 如果JS具有数字char数据类型,则可能没问题,但我认为手动执行此操作更容易如上所述。

如果你很好奇:

String.prototype.padLeft = function(n, x) {
     return (new Array(n).join(x || "0")+this).slice(-n);
};
function getNext(num) {
    var alphabet = "123456789ABCDEFGHJKLMNPQRSTUVWXYZ";
    var back = {}, forth = {};
    for (var i=0; i<alphabet.length; i++) {
        var a = alphabet[i],
            b = i.toString(36);
        back[a] = b;
        forth[b] = a;
    }
    return (parseInt(num.replace(/./g, function(c) {
        return back[c]; // base33 from alphabet
    }), alphabet.length) + 1)
      .toString(alphabet.length)
      .padLeft(3)
      .replace(/./g, function(c) {
        return forth[c]; // base33 to alphabet
      });
}