【问题标题】:Count with A, B, C, D instead of 0, 1, 2, 3, ... with JavaScript用 A、B、C、D 计数,而不是用 JavaScript 计数 0、1、2、3、...
【发布时间】:2012-06-18 19:07:08
【问题描述】:

这可能是一个不寻常的请求,但对于我的脚本,我需要一个按字母而不是数字递增的函数。例如:

这是一个数字示例:

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

基本上,我想用字母来计数,就像 Microsoft Excel 所做的那样,而不是数字。所以不是打印“我们在 0”、“我们在 1”、“我们在 2”等,我需要打印“我们在 A”、“我们在 B”、“我们在C”等

为了模仿 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(我认为)。

谢谢!

【问题讨论】:

  • 抱歉,您尝试了什么?到目前为止,这对我来说似乎是一项家庭作业。
  • 所以你需要写toNumber()和toLetter()。这看起来像一个非常简单的算法任务。向我们展示您的尝试。
  • 您可以构建一个字母数组,然后将您的计数与数组中的键进行比较(确保补偿“0”位置)。如果你的计数从零开始,那么你很好。
  • 我通过考虑以 26 为基数找到了解决方案。frugalcoder.us/post/2011/02/24/…
  • 那个代码很糟糕。它将数字转换为字符串,然后返回并修复它。直接转换它会更好(也更容易)。

标签: javascript count numbers counter


【解决方案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/

【讨论】:

  • 差不多。第三行应该是var out = String.fromCharCode(65 + (num % 26)); 否则将从零开始。
  • @Jules 它被严重破坏了......告诉我你现在的想法:)
  • 您的回答仍在帮助人们解决这个奇怪的要求。非常感谢!!
【解决方案2】:

你的意思是这样的吗?

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:将我的评论移到此处,因为它更相关。为了 IE (我认为是 8 及以下),需要 .split()。否则你需要.charAt()
  • 哦,真的吗?嗯...我应该确保我最近没有为自己编写任何 IE8 错误 :-)
【解决方案3】:

创建一个由字母 A、B、C、D 等组成的数组,然后使用 array[0] 调用 A,因为 0 是 A 的索引,您可以使用 array[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 构造函数在数组中预先分配空间;它实际上在任何现代运行时都不会做任何事情。
【解决方案4】:

试试下面的。在几分钟内尝试和测试

 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>

【讨论】:

    【解决方案5】:

    这就是你如何生成随机字母:

    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();
    

    【讨论】:

    • OP 不想要随机字母,他/她想要 excel 中的顺序
    猜你喜欢
    • 1970-01-01
    • 2016-10-14
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 2013-06-23
    • 1970-01-01
    • 2015-12-05
    相关资源
    最近更新 更多