将数字转换为字母字符串(Javascript)

11

我想把一个数字转换成字符,例如:

  • 如果数字是1,则对应的字符为A
  • 如果数字是26,则对应的字符为Z
  • 如果数字是27,则对应的字符为AA
  • 如果数字是676,则对应的字符为ZZ
  • 如果数字是456976,则对应的字符为ZZZZ

我尝试寻找任何有助于我解决此问题的内容,但没有成功。有人有JavaScript代码的示例吗?

谢谢!


那么关于 0 呢?你怎么转换它? - Thomas
这没有意义。它只能用A和Z完成吗?还是那些只是“边角案例”?如何获得AB?DE?XYZ? - ishegg
这里的逻辑在哪里呢?(26 + 1 == AA) && (26 * 26 == ZZ) - webdeb
6个回答

16
您展示的数字转换似乎不一致。看起来您想将数字转换为等效的电子表格列字母,类似于这个Python问题:Convert spreadsheet number to column letter。将该代码转换为javascript(并进行清理)如下:

function numToSSColumn(num){
  var s = '', t;

  while (num > 0) {
    t = (num - 1) % 26;
    s = String.fromCharCode(65 + t) + s;
    num = (num - t)/26 | 0;
  }
  return s || undefined;
}


// A  Z AA  CZ  DA  YZ  ZZ AAA
[0,1,26,27,104,105,676,702,703,
//AAZ ABA  AZZ  BAA  BAZ  BBA   YYYZ   ZZZZ
  728,729,1378,1379,1404,1405,456976,475254].forEach(function(n) {
  console.log(n + ' : ' + numToSSColumn(n));
});

如果n < 0,此函数不会检查输入并返回undefined

你的转换似乎无效,因为电子表格列不是从0开始,而是从1开始,所以A-Z是1到26,AA到AZ是27到52,依此类推。676是YZ,456976是YYYZ。ZZZZ是475254(或11110 base26)。


7

您需要编写一个循环,并在每次通过时将数字 mod (%) 26,然后使用以下内容:

 String.fromCharCode(num + 64) // if num is 1 then result is 'A'

4

我使用递归写了一个解决方案,只是出于好玩而已 :)

const numberToBase26 = (val, tail = '') => {
  if (val <= 26) {
    return `${String.fromCharCode(val + 64)}${tail}`;
  }

  const remainder = val % 26 || 26;
  const division = Math.trunc(val / 26) - (remainder === 26 ? 1 : 0);

  return numberToBase26(division, `${String.fromCharCode(remainder + 64)}${tail}`);
};

console.log(numberToBase26(475254), ' should be equal to ZZZZ');


1
重要的部分是charCodeAt,它返回任何字符的ASCII值。

function columnIndex(name) {
    let index = 0;

    name = name.toUpperCase().split('');

    for (let i = name.length - 1; i >= 0; i--) {
        let piece = name[i];
        let colNumber = piece.charCodeAt() - 64;
        index = index + colNumber * Number(Math.pow(26, name.length - (i + 1)));
    }

    return index;
}

['A', 'AA', 'AAA', 'AAB', 'MMMM', 'MMMN'].forEach((n) => {
    console.log(n + ' : ' + columnIndex(n));
});


1
你有一些很难理解的奇怪情况。如果 27 = AA,那么 52 = ZZ,但是根据你的例子,676 = ZZ。你能详细说明一下你想生成的系列吗? 以防万一,以下是满足我的例子的算法:
getAlphabetFromNumber = function (_num) {
    var str = "";

    multiples = Math.ceil(_num / 26);
    _charAtCode = _num - ((multiples - 1) * 26)

    for (let i = 0; i < multiples; i++)
        str += String.fromCharCode(_charAtCode + 64);

    return str;
}

0

以下是一个开始,打开你的检查器,选择控制台并粘贴以下代码:

cvt = function(n) {return(String.fromCharCode(n+'A'.charCodeAt(0)-1))}

现在你可以输入cvt(1)来得到'A',或者输入cvt(26)来得到'Z'

它只能用于一个字符。其余的就由你来解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接