JS:如何计算字母
JS: How to count in letters
我希望能够以 26 为基数进行计数,但只能使用字母表中的字母。
我可以涵盖 A + 1 = B
和 Z + 1 = AA
等基础知识,但我希望它能像 AZZEBERBZZ
一样工作很长时间 "numbers"
目前我在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
时,它只是 returns AAA
而不是 BA
我该如何解决这个问题?
额外上下文:
我需要函数 getNextColumn
,因为我使用此函数循环遍历从 excel sheet 创建的对象,其中列数在 base26
中但是只有字母没有数字
这是使用递归函数的完美候选者。
对于递归函数,您需要定义基本情况和递归情况。
您已经涵盖了基本情况,在这种情况下是 2 种情况:
- 输入以 "Z"
以外的其他字母结尾
- 输入为"Z"
在所有其他情况下,您的 "recursive situation" 输入:
- 以 "Z"
结尾
- 并且总共超过1个字母
对于这个 "recursive situation" 你可以 trim 最后一个 "Z" (因为无论如何你都需要用 "A" 替换它)然后再次调用这个函数,比如所以:
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";
}
基本上,您可以使用一个函数获取数值,使用另一个函数将数值转换回所需格式。这允许进行算术运算。
要获取数字,可以使用 parseInt
with base 36 and a correction of 9 (this gets only the value of letters) for the value and Array#reduce
获取字母的整数。
26 的因数是字母表的长度,再往左一个字母的位值为 26 倍。
要返回转换后的值,您可以使用 toString
和基数 36
来转换为想要的字母。
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')));
.as-console-wrapper { max-height: 100% !important; top: 0; }
我希望能够以 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
时,它只是 returns AAA
而不是 BA
我该如何解决这个问题?
额外上下文:
我需要函数 getNextColumn
,因为我使用此函数循环遍历从 excel sheet 创建的对象,其中列数在 base26
中但是只有字母没有数字
这是使用递归函数的完美候选者。
对于递归函数,您需要定义基本情况和递归情况。
您已经涵盖了基本情况,在这种情况下是 2 种情况:
- 输入以 "Z" 以外的其他字母结尾
- 输入为"Z"
在所有其他情况下,您的 "recursive situation" 输入:
- 以 "Z" 结尾
- 并且总共超过1个字母
对于这个 "recursive situation" 你可以 trim 最后一个 "Z" (因为无论如何你都需要用 "A" 替换它)然后再次调用这个函数,比如所以:
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";
}
基本上,您可以使用一个函数获取数值,使用另一个函数将数值转换回所需格式。这允许进行算术运算。
要获取数字,可以使用 parseInt
with base 36 and a correction of 9 (this gets only the value of letters) for the value and Array#reduce
获取字母的整数。
26 的因数是字母表的长度,再往左一个字母的位值为 26 倍。
要返回转换后的值,您可以使用 toString
和基数 36
来转换为想要的字母。
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')));
.as-console-wrapper { max-height: 100% !important; top: 0; }