JS:如何计算字母数

时间:2018-06-01 07:21:53

标签: javascript counting letters

我希望能够计入基数26,但只能使用字母表中的字母。

我可以涵盖A + 1 = BZ + 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中计算,但只有字母而没有数字

2 个答案:

答案 0 :(得分:0)

这是使用递归函数的理想选择。

使用递归函数,您需要定义基本情况和递归情况。

您已经涵盖了基本情况,在这种情况下有两种情况:

  • 输入以&#34; Z&#34;
  • 之外的其他字母结尾
  • 输入为&#34; Z&#34;

在所有其他情况下,您都有#34;递归情况&#34;你输入的地方:

  • 结束&#34; Z&#34;
  • 并且它总共超过1个字母

对于这个&#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}}转换为所需的字母。

&#13;
&#13;
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;
&#13;
&#13;