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

时间:2011-11-23 10:29:10

标签: javascript jquery

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

我正在使用jQuery来管理列的排序顺序,但是每个列的排序都像Excel电子表格一样,例如,... x y z aa ab ac ad等等

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

5 个答案:

答案 0 :(得分:48)

我认为你正在寻找类似的东西

    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>");

答案 1 :(得分:3)

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

function numberToLetters(num) {
    let letters = ''
    while (num >= 0) {
        letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[num % 26] + letters
        num = Math.floor(num / 26) - 1
    }
    return letters
}

答案 2 :(得分:2)

如果您的数据是二维数组,例如

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"

答案 3 :(得分:2)

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"

答案 4 :(得分:1)

您可以使用这样的代码,假设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);
}