189

我想根据字母将整数转换为其等效字符。例如:

0 => a
1 => b
2 => c
3 => d

等等。我可以构建一个数组并在需要时查找它,但我想知道是否有内置函数可以为我执行此操作。我通过 Google 找到的所有示例都使用 ASCII 值,而不是字符在字母表中的位置。

4

12 回答 12

346

假设您想要小写字母:

var chr = String.fromCharCode(97 + n); // where n is 0, 1, 2 ...

97 是小写“a”的 ASCII 码。如果需要大写字母,请将 97 替换为 65(大写“A”)。请注意,如果n > 25,您将超出字母范围。

于 2010-06-29T21:54:27.390 回答
88

在扩展到其他字母的情况下将更便携:

char='abcdefghijklmnopqrstuvwxyz'[code]

或者,为了更兼容(与我们心爱的 IE):

char='abcdefghijklmnopqrstuvwxyz'.charAt(code);
于 2010-06-29T21:54:00.983 回答
33

如果您不介意返回多字符串,则可以支持任意正索引:

function idOf(i) {
    return (i >= 26 ? idOf((i / 26 >> 0) - 1) : '') +  'abcdefghijklmnopqrstuvwxyz'[i % 26 >> 0];
}

idOf(0) // a
idOf(1) // b
idOf(25) // z
idOf(26) // aa
idOf(27) // ab
idOf(701) // zz
idOf(702) // aaa
idOf(703) // aab

(未彻底测试精度错误:)

于 2015-08-14T10:31:27.550 回答
20

一个简单的答案是(26 个字符):

String.fromCharCode(97+n);

如果空间很宝贵,您可以执行以下操作(20 个字符):

(10+n).toString(36);

想想你可以用所有这些额外的字节做什么!

它的工作原理是将数字转换为基数 36,因此您有以下字符:

0123456789abcdefghijklmnopqrstuvwxyz
^         ^
n        n+10

通过偏移 10,字符开始于a而不是0.

不完全确定客户端运行这两个不同示例的速度会有多快。

于 2016-05-20T16:19:23.167 回答
8

我不喜欢所有使用幻数的解决方案,例如97or 36

const A = 'A'.charCodeAt(0);

let numberToCharacter = number => String.fromCharCode(A + number);

let characterToNumber = character => character.charCodeAt(0) - A;

这假定大写字母并从 0 开始“A”。

于 2018-09-26T13:11:02.847 回答
6

Javascript 的 String.fromCharCode(code1, code2, ..., codeN) 接受无限数量的参数并返回一串字母,其对应的 ASCII 值为 code1, code2, ... codeN。由于 97 在 ASCII 中是“a”,因此我们可以通过将 97 添加到您的索引来调整您的索引。

function indexToChar(i) {
  return String.fromCharCode(i+97); //97 in ASCII is 'a', so i=0 returns 'a', 
                                    // i=1 returns 'b', etc
}
于 2010-06-29T21:55:28.750 回答
3

你去:(a-zA-Z)

function codeToChar( number ) {
  if ( number >= 0 && number <= 25 ) // a-z
    number = number + 97;
  else if ( number >= 26 && number <= 51 ) // A-Z
    number = number + (65-26);
  else
    return false; // range error
  return String.fromCharCode( number );
}

输入:0-51,否则返回false(范围错误);

或者:

var codeToChar = function() {
  var abc = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".split("");
  return function( code ) {
    return abc[code];
  };
})();

在范围错误的情况下返回 undefined。注意:该数组将只创建一次,并且由于关闭,它将可用于新的 codeToChar 函数。我想它比第一种方法更快(基本上只是一个查找)。

于 2010-06-29T21:53:43.820 回答
3

使用String.fromCharCode. 这会从 Unicode 值返回一个字符串,该字符串与 ASCII 的前 128 个字符匹配。

var a = String.fromCharCode(97);
于 2010-06-29T21:58:00.987 回答
1

@mikemaccana 的出色解决方案的唯一问题是它使用了二进制 >> 运算符,这在性能方面成本高昂。我建议对他的伟大著作进行修改,作为你的同事可能更容易阅读的轻微改进。

const getColumnName = (i) => {
     const previousLetters = (i >= 26 ? getColumnName(Math.floor(i / 26) -1 ) : '');
     const lastLetter = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[i % 26]; 
     return previousLetters + lastLetter;
}

或作为单线

const getColumnName = i => (i >= 26 ? getColumnName(Math.floor(i / 26) -1 ) : '') + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[i % 26];

例子:

getColumnName(0); // "A"
getColumnName(1); // "B"
getColumnName(25); // "Z"
getColumnName(26); // "AA"
getColumnName(27); // "AB"
getColumnName(80085) // "DNLF"
于 2018-01-10T21:08:32.720 回答
1

尝试

(n+10).toString(36)

chr = n=>(n+10).toString(36);

for(i=0; i<26; i++) console.log(`${i} => ${ chr(i) }`);

于 2019-10-07T14:22:01.203 回答
0

如果您正在寻找 TypeScript 工作功能,请遵循

public numericValue = (alphaChar: any) => alphaChar.toUpperCase().charCodeAt(0) - 64;

public alphaValue = (numericDigit: any) => 
   String.fromCharCode(64 + numericDigit) : '';

您可以根据要求进行多项检查,例如(numericDigit >= 1 && numericDigit <= 26) ? 在函数体内进行检查。

于 2020-07-29T11:28:10.030 回答
-3

假设您想要大写字母:

function numberToLetter(num){
        var alf={
            '0': 'A', '1': 'B', '2': 'C', '3': 'D', '4': 'E', '5': 'F', '6': 'G'
        };
        if(num.length== 1) return alf[num] || ' ';
        return num.split('').map(numberToLetter);
    }

例子:

numberToLetter('023')["A", "C", "D"]

numberToLetter('5')"F"

数字转字母功能

于 2016-09-04T03:30:24.173 回答