实现编号方案,如A,B,C ... AA,AB,... AAA ...,类似于将数字转换为radix26

时间:2012-10-02 22:02:50

标签: javascript algorithm character-encoding type-conversion

  

可能重复:
  Xnary (like binary but different) counting

在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('');
}

它似乎工作正常,但任何想法优化它或其他实现方式?

2 个答案:

答案 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”更改为您需要的任何内容。