使用 JavaScript 计算 A、B、C、D,而不是 0、1、2、3...

问题描述 投票:0回答:7

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

这是一个数字示例:

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

谢谢!

javascript count numbers counter
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/


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

0
投票

创建一个由字母 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";

代替

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


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

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))
  );
}
© www.soinside.com 2019 - 2024. All rights reserved.