【发布时间】:2011-11-23 10:29:09
【问题描述】:
我正在为可映射的电子表格导出功能创建一些客户端函数。
我使用 jQuery 来管理列的排序顺序,但每一列的排序就像 Excel 电子表格一样,即 a b c d e......x y z aa ab ac ad 等
如何将数字生成为字母?我应该定义一个固定的值数组吗?或者有没有一种动态的方式来生成这个?
【问题讨论】:
标签: javascript jquery
我正在为可映射的电子表格导出功能创建一些客户端函数。
我使用 jQuery 来管理列的排序顺序,但每一列的排序就像 Excel 电子表格一样,即 a b c d e......x y z aa ab ac ad 等
如何将数字生成为字母?我应该定义一个固定的值数组吗?或者有没有一种动态的方式来生成这个?
【问题讨论】:
标签: javascript jquery
这是一个非常简单的方法:
function numberToLetters(num) {
let letters = ''
while (num >= 0) {
letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[num % 26] + letters
num = Math.floor(num / 26) - 1
}
return letters
}
【讨论】:
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"
【讨论】:
我认为您正在寻找类似的东西
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>");
【讨论】:
n = Math.floor(n / len) - 1?你为什么在这里减去1?我很难理解背后的想法。我在这里和那里阅读了几个答案,但不明白它为什么起作用。请解释:)
Math.floor() 是一个浮点运算,上面也已经计算了 n%len,那行是n = (n - n%len) / len -1;。在这个用例中,这不是性能问题,但从我的角度来看,它更容易阅读,因为没有使用 FPU op 来获取 int
如果您将数据保存在二维数组中,例如
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"
【讨论】:
简单的递归解决方案:
function numberToColumn(n) {
const res = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[n % 26];
return n >= 26 ? numberToColumn(Math.floor(n / 26) - 1) + res : res;
}
【讨论】:
您可以使用这样的代码,假设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);
}
【讨论】:
这涵盖了从 1 到 1000 的范围。超出的范围我没有检查。
function colToletters(num) {
let a = " ABCDEFGHIJKLMNOPQRSTUVWXYZ";
if (num < 27) return a[num % a.length];
if (num > 26) {
num--;
let letters = ''
while (num >= 0) {
letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[num % 26] + letters
num = Math.floor(num / 26) - 1
}
return letters;
}
}
我可能是错的,但我检查了这个答案中的其他函数,它们似乎在 26 处失败,应该是 Z。记住字母表中有 26 个字母而不是 25。
【讨论】: