将整数转换为它的字符等价物,其中0 = > a,1 = > b,等等

我想根据字母表把一个整数转换成它的字符等价物。例如:

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

等等。我可以构建一个数组,当我需要它的时候就可以查找它,但是我想知道是否有一个内置的函数来为我做这件事。我通过谷歌找到的所有例子都是使用 ASCII 值,而不是字母表中某个字符的位置。

191795 次浏览

就是这样: (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];
};
})();

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

如果扩展到其他字母表,将更便于携带:

char='abcdefghijklmnopqrstuvwxyz'[code]

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

char='abcdefghijklmnopqrstuvwxyz'.charAt(code);

假设你想要小写字母:

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

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

Javascript 的 String.from CharCode (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
}

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

var a = String.fromCharCode(97);

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

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


[0, 1, 25, 26, 27, 701, 702, 703].map(idOf);
// ['a', 'b', 'z', 'aa', 'ab', 'zz', 'aaa', 'aab']

(未经精度误差彻底测试:)

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

String.fromCharCode(97+n);

如果空间很宝贵,你可以这样做(20个字符) :

(10+n).toString(36);

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

它的工作原理是将数字转换为以36为基数,这样就有了以下字符:

0123456789abcdefghijklmnopqrstuvwxyz
^         ^
n        n+10

通过偏移10,字符从 a开始,而不是从 0开始。

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

假设你想要大写字母:

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

例如:

NumberToLetters (’023’) is < strong > [“ A”,“ C”,“ D”]

NumberToLetters (’5’) is < strong > “ F”

number to letter function

@ 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"

我不喜欢所有的解决方案,使用神奇的数字,如 9736

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


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


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

这里假设大写字母为“ A”并以0开头。

试试看

(n+10).toString(36)

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


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

如果您正在寻找 TypeScript 工作函数,请跟随

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


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

您可以根据需要在函数体内进行多次类似 (numericDigit >= 1 && numericDigit <= 26) ? 的检查。