JS仿Excel数字转英文字母
前言
开发的时候遇到一个需求,其中需要使用js模拟Excel,将数字转换成Excel一样的英文字母。本质上其实就是进制转换,10进制转换成26进制。即:
1 => A
26 => Z
27 => AA
703 => AAA
正文
数字转英文字母
1) 转换结果的最后一位可以根据数字对26的求余计算得到,即:
27 对 26 求余,余数为1,转换为英文字母为A。
27 % 26 = 1 … 1 => A
703 对 26求余,余数为1,转换为英文字母为A。
703 % 26 = 27 … 1 => A
2)转换结果 – 其对26的余数 可以确定转换结果的前面部分,循环直到转换结束即可。
完整代码:
xxxxxxxxxx
221function convertDSTo26BS(num) {
2 let code = '';
3
4 // 检验数字
5 let reg = /^\d+$/g;
6 if (!reg.test(num)) return code;
7
8 // 利用余数倒序求转换结果
9 while (num > 0) {
10 let temp = num % 26;
11 if (temp === 0) temp = 26;
12
13 // 利用ASCII转换成英文
14 code = String.fromCharCode(64 + parseInt(temp)) + code;
15 num = (num - temp) / 26;
16 }
17 return code;
18}
19
20convertDSTo26BS(26); // Z
21convertDSTo26BS(27); // AA
22convertDSTo26BS(703); // AAA
注:转换成英文时使用的是 64
,而不是 65
,因为想要的对应关系是 1=>A,如果使用65
的话,将会变成0 => A
英文字母转数字
同理,附带上英文字母转数字的代码:
xxxxxxxxxx
131function convert26BSToDS(code) {
2 let reg = /^[A-Z]+$/g;
3 if (!reg.test(code)) return -1;
4
5 let num = 0;
6 for (let i = code.length - 1, j = 1; i >= 0; i--, j *= 26) {
7 num += (code[i].charCodeAt(0) - 64) * j;
8 }
9 return num;
10}
11
12convert26BSToDS('AAA'); // 703
13convert26BSToDS('AA'); // 27
注:与上同理,此处使用64
,而非65
。