将数字转换为 26 个字符以外的字母

IT技术 javascript jquery
2021-01-27 11:54:53

我正在为可映射的电子表格导出功能创建一些客户端函数。

我正在使用 jQuery 来管理列的排序顺序,但每列的排序方式都类似于 Excel 电子表格,即 abcd e......xyz aa a b ac ad 等

如何将数字生成为字母?我应该定义一个固定的值数组吗?或者有没有一种动态的方式来生成这个?

6个回答

我想你正在寻找这样的东西

    function colName(n) {
        var ordA = 'a'.charCodeAt(0);
        var ordZ = 'z'.charCodeAt(0);
        var len = ordZ - ordA + 1;
      
        var s = "";
        while(n >= 0) {
            s = String.fromCharCode(n % len + ordA) + s;
            n = Math.floor(n / len) - 1;
        }
        return s;
    }

// Example:

    for(n = 0; n < 125; n++)
            document.write(n + ":" + colName(n) + "<br>");

@georg 你能解释一下基本转换是如何工作的吗?我的意思是为什么n = Math.floor(n / len) - 1你为什么要在这里减去1我很难理解它背后的想法。我在这里和那里阅读了几个答案,但不明白它为什么有效。请解释 :)
2021-03-17 11:54:53
很好的答案,但我希望看到它背后的解释。像 97 这样的东西代表小“a”等。
2021-03-23 11:54:53
Math.floor()是一个浮点运算,上面也已经计算了 n%len,那一行是n = (n - n%len) / len -1;. 在这个用例中,这不是性能问题,但从我的角度来看,它更容易阅读,因为没有使用 FPU op 来获取 int
2021-03-31 11:54:53
@YaseenMollik:嗨,请参阅stackoverflow.com/a/8798330/989121以获得很好的解释。
2021-04-05 11:54:53

这是一个非常简单的方法:

function numberToLetters(num) {
    let letters = ''
    while (num >= 0) {
        letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[num % 26] + letters
        num = Math.floor(num / 26) - 1
    }
    return letters
}
@Cooper 它有效。701 返回“ZZ”,702 返回“AAA”。然后依次为:“AAB”、“AAC”。与 Excel 中相同。
2021-03-22 11:54:53
这在 701 以上不起作用。但话又说回来,我什至不知道列是否可以达到 AAA
2021-03-30 11:54:53
function getColumnDescription(i) {
  const m = i % 26;
  const c = String.fromCharCode(65 + m);
  const r = i - m;
  return r > 0
    ? `${getColumnDescription((r - 1) / 26)}${c}`
    : `Column ${c}`
}

用法:

getColumnDescription(15)
"Column P"

getColumnDescription(26)
"Column AA"

getColumnDescription(4460)
"Column FOO"

如果您的数据位于二维数组中,例如

var data = [
  ['Day', 'score],
  ['Monday', 99],
];

您可以将行/列映射到电子表格单元格编号,如下所示(基于上面的代码示例):

function getSpreadSheetCellNumber(row, column) {
  let result = '';

  // Get spreadsheet column letter
  let n = column;
  while (n >= 0) {
    result = String.fromCharCode(n % 26 + 65) + result;
    n = Math.floor(n / 26) - 1;
  }

  // Get spreadsheet row number
  result += `${row + 1}`;

  return result;
};

例如,来自 data[0][0] 的“Day”值将出现在电子表格单元格 A1 中。

> getSpreadSheetCellNumber(0, 0)
> "A1"

当您有 26 列以上时,这也适用:

> getSpreadSheetCellNumber(0, 26)
> "AA1"

您可以使用这样的代码,假设其中numbers包含您的列数。因此,在此代码之后,您将获得列的字符串名称:

var letters = ['a', 'b', 'c', ..., 'z'];
var numbers = [1, 2, 3, ...];
var columnNames = [];
for(var i=0;i<numbers.length;i++) {
    var firstLetter = parseInt(i/letters.length) == 0 ? '' : letters[parseInt(i/letters.length)];
    var secondLetter = letters[i%letters.length-1];
    columnNames.push(firstLetter + secondLetter);
}
感谢那。这很好用,但它不仅仅以单个字符开头,即 a、b、c、d....x、y、z、aa、ab、ac?
2021-03-17 11:54:53