使用JavaScript将计数器从0、1、2、3……改为A、B、C、D等字母。

13

这可能是一个不寻常的请求,但是我需要一个以字母而非数字增量的函数。例如:

这是一个数值示例:

var i = 0;
while(condition){
 window.write('We are at '+i);
 ++i;
}

本质上,我想要像Microsoft Excel一样使用字母计数,而不是数字。 因此,我需要打印"We are at A","We are at B","We are at C"等,而不是打印"We are at 0","We are at 1","We are at 2"等。

为了模仿Excel(我唯一能想到的例子),在达到索引25(Z)后,我们可以继续使用'AA','AB','AC'等。

因此,它可以像这样很好地工作:

var i = 0;
while(condition){
 window.write('We are at '+toLetter(i));
 ++i;
}

更好的是,如果有人能够编写一个函数,将字母转换回数字,即 toNumber('A') = 0 或 toNumber('DC') = 107(我想)。

谢谢!


2
抱歉问一下,你尝试了什么?到目前为止,这看起来像是一道作业。 - alf
所以你需要编写toNumber()和toLetter()函数。这看起来像一个非常简单的算法问题。展示一下你尝试过什么。 - Al Kepp
你可以建立一个字母数组,然后将你的计数与数组中的键比较(确保要补偿“0”位置)。如果你的计数从零开始,那么就万事大吉了。 - gtr1971
我通过以26进制的方式思考找到了解决方案。 http://frugalcoder.us/post/2011/02/24/Convert-an-integer-to-a-base26-alpha-string.aspx - M Miller
作业:你的代码中哪一部分会导致 TypeError: Object [object Window] has no method 'write' 错误? - KooiInc
显示剩余3条评论
7个回答

40

这是一个简单的递归函数,用于将数字转换为字母。

它从1开始,因此1表示A,26表示Z,27表示AA。

function toLetters(num) {
    "use strict";
    var mod = num % 26,
        pow = num / 26 | 0,
        out = mod ? String.fromCharCode(64 + mod) : (--pow, 'Z');
    return pow ? toLetters(pow) + out : out;
}

这是一个匹配函数,用于将字符串转换回数字:

function fromLetters(str) {
    "use strict";
    var out = 0, len = str.length, pos = len;
    while (--pos > -1) {
        out += (str.charCodeAt(pos) - 64) * Math.pow(26, len - 1 - pos);
    }
    return out;
}

一个测试: http://jsfiddle.net/St6c9/


1
几乎了。第三行应该是var out = String.fromCharCode(65 + (num % 26));,否则它将以零为基础。 - Jules Colle
@Jules,它之前相当糟糕...现在你认为它怎么样了 :) - Dagg Nabbit
1
你的回答仍在帮助人们解决这个奇怪的需求。非常感谢!! - MarceloRB

3
你是说像这样的东西吗?
function num2chars(num, upper){
 num2chars.letters = num2chars.letters || 'abcdefghijklmnopqrstuvwxyz'.split('');
 var ret = repeat(num2chars.letters[num%26],Math.floor(num/26));

 function repeat(chr,n){
  if (n<1) {return chr;}
  return new Array(n+1).join(chr);
 }

 return upper ? ret.toUpperCase() : ret;
}
//usage
while(i<104){
 console.log(num2chars((i+=1),true));
}
//=> A..Z, AA..ZZ, AAA..ZZZ

JavaScript允许您像数组一样索引字符串,因此实际上没有必要使用.split() - Pointy
@Pointy:我把我的评论移到这里,因为它更相关。.split()是为了IE的缘故(我认为是8及以下版本)。否则你需要使用.charAt() - user1106925
2
哦,真的吗?嗯...我应该确保最近没有编写任何IE8的错误了 :-) - Pointy

0
创建一个字母数组A、B、C、D等,然后通过使用array[0]来调用A,因为0是A的索引,您可以使用array[i]作为索引,只需验证i不能超过25即可。
使用以下任一方式创建数组:
var alphabet = new Array("A","B","C");

var alphabet = new Array(25);
alphabet[0] = "A";
alphabet[1] = "B";
alphabet[2] = "C";

使用alphabet[i];代替toLetter(i);


我认为我不会这样做,但如果我这样做了,我会用一个字符串来包含字母表中的所有字符。JavaScript 允许你使用数组符号访问字符串的字符。另外:在任何现代运行时中,通过 Array 构造函数预先分配数组空间是没有必要的,它实际上并不会产生任何作用。 - Pointy

0
尝试以下方法。在几分钟内经过尝试和测试。
 var prefix = Array('','A','B'); //this will extends to 3x26 letters. Determines the Max generated
//first element of prefix is `''` so you can have A B C D
var prefix = Array('','A','B');
var alphabets = Array('A','B','C','D'); //extend this to Z
var letters = Array();

function fillArray()
{
   var prefix_len = prefix.length;
   var array_len = prefix_len * alphabets.length;
   var alpha_len = alphabets.length;

   for(var i=0; i<prefix_len; i++)
   {
      for(var a=0; a<alpha_len; a++)
         letters.push(''+prefix[i]+alphabets[a]);
   }



}

function getLetter(index)
{
  return letters[index];
}


function generateTestValues() 
{
  fillArray();
  //make sure 10 is less than letters.length
  for(var i=0; i<10; i++)
     document.write(getLetter(i)+' ');  //A B C D AA AB AC AD BA BB BC....
}

HTML

<span id="clickable" onclick="generateTestValues()">Click Me</span>

0

这是如何生成随机字母的方法:

function getRandomArbitrary(min, max) {
  max = Math.ceil(max);
  min = Math.floor(min); 
  return Math.round(Math.random() * (max - min) + min);
}

function assignLetter(){
  var group = ['A', 'B', 'C', 'D'];
  var text = 'We are at ';
  var str = '';
  str = text + group[getRandomArbitrary(0, group.length-1)];
  return str;
}
assignLetter();

1
OP不想要随机字母,他/她希望像Excel一样是顺序的。 - MotKohn

0

为了未来的读者,我留下我认为更直接的解决方案:

    const aLetterCode = 97
    const getLetterFromId = (number) => String.fromCharCode(aLetterCode + number)

    console.log('code 0 ->', getLetterFromId(0)) // a
    console.log('code 1 ->', getLetterFromId(1)) // b
    console.log('code 12 ->', getLetterFromId(12)) // m


0
尝试以下方法:
function getCharCode(value) {
  if (value===null || value === undefined) return "";
  if (value < 26) return String.fromCharCode(65 + value);
  return (
    getCharCode(Number(value / 26) - 1) + String.fromCharCode(65 + (value % 26))
  );
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接