我正在尝试在Javascript中创建一个字母数字序列号,序列号由以下规则管理:
最后一部分很棘手,基本上代码会获取序列号的现有值,然后它会将输出作为下一个数字。
例如:如果输入数字11D则输出数字应为11E。如果这个描述足以解释我的要求,请告诉我。
相同的Excel工作表附有here
此脚本将获取起始值11D的代码部分来自此代码:
cur_frm.add_fetch('item_group','serial_number','serial_number');
答案 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
也可能已完成。只有您需要“跳过”0
,I
和O
,这意味着将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
});
}