Javascript 将整数转换为其等效字符,其中0=>;a、 1=>;b、 等
我想根据字母表将一个整数转换为它的等效字符。例如:Javascript 将整数转换为其等效字符,其中0=>;a、 1=>;b、 等,javascript,integer,alphabet,Javascript,Integer,Alphabet,我想根据字母表将一个整数转换为它的等效字符。例如: 0 => a 1 => b 2 => c 3 => d 等等,我可以建立一个数组,在我需要的时候查找它,但我想知道是否有一个内置的函数来为我做这件事。我通过谷歌找到的所有例子都是使用ASCII值,而不是字符在字母表中的位置。好了:(a-zA-Z) 在范围错误的情况下返回未定义。 注意:数组将只创建一次,由于关闭,它将可用于新的codeToChar函数。我想它比第一种方法更快(基本上只是一种查找)。如果扩展到其他字母表,
0 => a
1 => b
2 => c
3 => d
等等,我可以建立一个数组,在我需要的时候查找它,但我想知道是否有一个内置的函数来为我做这件事。我通过谷歌找到的所有例子都是使用ASCII值,而不是字符在字母表中的位置。好了:(a-zA-Z)
在范围错误的情况下返回未定义。
注意:数组将只创建一次,由于关闭,它将可用于新的codeToChar函数。我想它比第一种方法更快(基本上只是一种查找)。如果扩展到其他字母表,它将更易于移植:
char='abcdefghijklmnopqrstuvwxyz'[code]
或者,为了更兼容(与我们心爱的IE):
假设您想要小写字母:
var chr = String.fromCharCode(97 + n); // where n is 0, 1, 2 ...
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);
}
97是小写字母“a”的ASCII码。如果需要大写字母,请将97替换为65(大写字母“A”)。请注意,如果
n>25
,您将超出字母范围。Javascript的字符串。fromCharCode(code1,code2,…,codeN)接受无穷多个参数并返回一个字母字符串,其对应的ASCII值为code1,code2。。。科登。由于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];
}
idOf(0) // a
idOf(1) // b
idOf(25) // z
idOf(26) // aa
idOf(27) // ab
idOf(701) // zz
idOf(702) // aaa
idOf(703) // aab
(未彻底测试精度错误:)简单的答案是(26个字符):
如果空间宝贵,您可以执行以下操作(20个字符):
想想你能用这些额外的字节做些什么
其工作原理是将数字转换为基数36,因此具有以下字符:
String.fromCharCode(97+n);
(10+n).toString(36);
0123456789abcdefghijklmnopqrstuvwxyz
^ ^
n n+10
通过偏移10,字符从a
开始,而不是0
但不完全确定客户端运行这两个不同示例的速度会有多快。假设您需要大写字母:
var chr = String.fromCharCode(97 + n); // where n is 0, 1, 2 ...
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);
}
例如:
getColumnName(0); // "A"
getColumnName(1); // "B"
getColumnName(25); // "Z"
getColumnName(26); // "AA"
getColumnName(27); // "AB"
getColumnName(80085) // "DNLF"
数字字母('023')是[“A”、“C”、“D”]
数字字母('5')是“F”
@mikemacana伟大的解决方案唯一的问题是,它使用了二进制>>运算符,这是一种昂贵的性能优化方法。我建议对他的伟大作品进行修改,这是一个小小的改进,你的同事或许可以更容易地阅读
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"
我不喜欢所有使用幻数的解决方案,如
97
或36
const A = 'A'.charCodeAt(0);
let numberToCharacter = number => String.fromCharCode(A + number);
let characterToNumber = character => character.charCodeAt(0) - A;
这将采用大写字母,并从0开始“A”。试试看
(n+10).toString(36)
chr=n=>(n+10).toString(36);
对于(i=0;i${chr(i)}`)代码>如果您正在寻找TypeScript工作函数,请遵循
public numericValue = (alphaChar: any) => alphaChar.toUpperCase().charCodeAt(0) - 64;
public alphaValue = (numericDigit: any) =>
String.fromCharCode(64 + numericDigit) : '';
您可以进行多项检查,如(numericDigit>=1&&numericDigit适用于ASCII,我需要处理字符在字母表中的位置。@VIVA-我想你可能已经解决了这个问题?@Galambalaza-我想你想要的是65而不是64我只是展示了它有多简单。他可能已经解决了。但是你看更新了小写字母按字母顺序排列在我看来,正如你所说,fromCharCode
扩展非常容易。当你不需要扩展时,可能更容易出错?abcedeFYI JScript(IE)不支持字符串上的索引运算符[]
。@Crescent,[]IE从IE8开始支持字符串上的
属性访问器(IE7兼容模式下的IE8也不起作用),为了浏览器兼容性,首选使用它而不是[]
。例如'foo'。charAt(0)='f'
@Crescent,忘记提到字符串上的[]
属性访问器在ECMAScript 5上是标准化的(请参阅).好吧,学究的意思是,它需要可变数量的参数,而不是无限数量的参数。递归函数,非常好!@Mikemacana,为什么要进行这种编辑?我认为这会使阅读变得更困难。现在我必须水平滚动来阅读代码。@z0r这样使用代码的人就不必修复换行符。没有理由任意换行,编辑器w我会按照他们窗口的字符大小包装。好主意,但直到改成这样才起作用:函数idOf(i){return(i>=26?idOf(Math.floor(i/26)-1):“”)+“ABCDEFGHIJKLMNOPQRSTUVWXYZ”[i%26];}
我很喜欢你的基本创意