我想根据字母将整数转换为等效的字符。例如:
0 => a
1 => b
2 => c
3 => d
等等。我可以构建一个数组,并在需要时查找它,但我想知道是否有内置函数可以为我执行此操作。我在Google上找到的所有示例都使用ASCII值,而不是字母中字符的位置。
我想根据字母将整数转换为等效的字符。例如:
0 => a
1 => b
2 => c
3 => d
等等。我可以构建一个数组,并在需要时查找它,但我想知道是否有内置函数可以为我执行此操作。我在Google上找到的所有示例都使用ASCII值,而不是字母中字符的位置。
Answers:
假设您要使用小写字母:
var chr = String.fromCharCode(97 + n); // where n is 0, 1, 2 ...
97是小写字母“ a”的ASCII码。如果要使用大写字母,请将97替换为65(大写的“ A”)。请注意,如果n > 25
,您将超出字母范围。
在扩展到其他字母的情况下将更便于携带:
char='abcdefghijklmnopqrstuvwxyz'[code]
或者,为了更兼容(与我们钟爱的IE):
char='abcdefghijklmnopqrstuvwxyz'.charAt(code);
String.fromCharCode
正如您所言,它比我认为的优雅得多,并且非常容易扩展。
[]
字符串的索引运算符。
[]
从IE8到IE的IE都支持字符串的属性访问器(在IE7兼容模式下的IE8也不起作用),String.prototype.chatAt
而不是与[]
浏览器兼容而不是首选。EG'foo'.charAt(0) == 'f'
[]
字符串的属性访问器已在ECMAScript 5上标准化(请参阅[[GetOwnProperty]](P))。
如果您不介意返回多字符字符串,则可以支持任意正索引:
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
(未经彻底的精度错误测试:)
function idOf(i) { return (i >= 26 ? idOf(Math.floor(i / 26) -1 ) : '') + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[i % 26]; }
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
}
你去了:(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函数。我猜它比第一种方法要快(基本上只是查找)。
@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"
假设您要使用大写字母:
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”