在JavaScript中,我想在JavaScript中实现编号方案,以便1为A,2为B,.... 26为Z,27为AA,28为AB .....
为此,继承代码:
function convertor(n){
var x = n-1,
baseCharCode = "A".charCodeAt(0);
var arr = x.toString(26).split(''),
len = arr.length;
return arr.map(function(val,i){
val = parseInt(val,26);
if( (i === 0) && ( len > 1)){
val = val-1;
}
return String.fromCharCode(baseCharCode + val);
}).join('');
}
它似乎工作正常,但任何想法优化它或其他实现方式?
答案 0 :(得分:3)
这个系统类似于Hexavigesimal(以A = 0开头),被称为双射基-26(它没有0)。您可以使用标准的基本转换算法进行转换,如下所示:
function toDecimal(str) {
var decimal = 0;
var letters = str.split(new RegExp());
for(var i = letters.length - 1; i >= 0; i--) {
decimal += (letters[i].charCodeAt(0) - 64) * (Math.pow(26, letters.length - (i + 1)));
}
return decimal;
}
基本上,您将hexavigesimal转换为base 10,如下所示。假设你必须字符串“AB”。你拥有的是:
1 0 (positions)
---
A B
+ +
| |
| +----> 2 * (26 ^ 0) +
+------> 1 * (26 ^ 1)
= 28
给你28。
另一个例子:
2 1 0 (positions)
A B C
+ + +
| | |
| | +----> 3 * (26 ^ 0) +
| +------> 2 * (26 ^ 1) +
+--------> 1 * (26 ^ 2)
= 731
答案 1 :(得分:0)
我有点困惑。您是否希望从整数转换为伪radix-26,或者反过来?
对于数字到字符串,这样的东西应该有效:
var digits = ['A', 'B', 'C', 'D', 'E', 'F',
'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
'W', 'X', 'Y', 'Z' ];
function converter(n) {
n = n - 1;
var result = [];
if (n === 0) { return digits[0]; }
while (n > 0) {
result.shift(digits[n % 26]);
n = Math.floor(n / 26);
}
return result.join('');
}
这种基本技术适用于任何基本转换,只需将“26”更改为您需要的任何内容。