我希望能够计入基数26,但只能使用字母表中的字母。
我可以涵盖A + 1 = B
和Z + 1 = AA
这样的基础知识,但我希望它可以工作很长时间"数字"比如AZZEBERBZZ
目前我在JavaScript中有以下代码
function getNextColumn(currentColumn) {
currentColumn = currentColumn.toUpperCase();
let lastLetterCode = currentColumn.charCodeAt(currentColumn.length - 1);
if(lastLetterCode < 90) {
return currentColumn.slice(0, -1) + String.fromCharCode(lastLetterCode + 1);
} else {
return currentColumn.slice(0, -1) + "A";
}
}
但问题是,当我在AZ
时,它只返回AAA
而不是BA
我该如何解决这个问题?
额外背景:
我需要函数getNextColumn
,因为我使用此函数循环遍历从Excel工作表创建的对象,其中列在base26
中计算,但只有字母而没有数字
答案 0 :(得分:0)
这是使用递归函数的理想选择。
使用递归函数,您需要定义基本情况和递归情况。
您已经涵盖了基本情况,在这种情况下有两种情况:
在所有其他情况下,您都有#34;递归情况&#34;你输入的地方:
对于这个&#34;递归情况&#34;你可以修剪最后的&#34; Z&#34; (因为你需要用&#34; A&#34;无论如何)替换它然后再次调用这个函数,如下所示:
function getNextColumn(currentColumn) {
currentColumn = currentColumn.toUpperCase();
let lastLetterCode = currentColumn.charCodeAt(currentColumn.length - 1);
if(currentColumn === "Z"){
return "AA";
}
if(lastLetterCode < 90) {
return currentColumn.slice(0, -1) + String.fromCharCode(lastLetterCode + 1);
}
return getNextColumn(currentColumn.slice(0, -1)) + "A";
}
答案 1 :(得分:0)
基本上,您可以使用一个函数来获取数值,使用另一个函数将数值转换回所需的格式。这允许进行算术运算。
要获得一个数字,您可以使用parseInt
和基数36,并使用9的修正(这只得到字母的值)和Array#reduce
来获得整数字母。
26的因子是字母表的长度,而剩下的字母则是26的位值。
要将转换后的值设置回来,您可以使用基数toString
的{{1}}转换为所需的字母。
36
&#13;
function getValue(s) {
return s.split('').reduce((r, a) => r * 26 + parseInt(a, 36) - 9, 0) - 1;
}
function setValue(n) {
var result = '';
do {
result = (n % 26 + 10).toString(36) + result;
n = Math.floor(n / 26) - 1;
} while (n >= 0)
return result.toUpperCase();
}
console.log(getValue('A')); // 0
console.log(setValue(getValue('A')));
console.log(getValue('B')); // 1
console.log(setValue(getValue('B')));
console.log(getValue('Z')); // 25
console.log(setValue(getValue('Z')));
console.log(getValue('AA')); // 26
console.log(setValue(getValue('AA')));
console.log(getValue('AZ')); // 51
console.log(setValue(getValue('AZ')));
console.log(getValue('CZ')); // 103
console.log(setValue(getValue('CZ')));
console.log(getValue('ZZ')); // 701
console.log(setValue(getValue('ZZ')));
console.log(getValue('DXH')); // 3335
console.log(setValue(getValue('DXH')));
&#13;