将整数转换为其等效字符,其中 0 => a、1 => b 等
Posted
技术标签:
【中文标题】将整数转换为其等效字符,其中 0 => a、1 => b 等【英文标题】:Convert integer into its character equivalent, where 0 => a, 1 => b, etc 【发布时间】:2011-03-09 20:54:21 【问题描述】:我想根据字母表将整数转换为其等效字符。例如:
0 => a
1 => b
2 => c
3 => d
等等。我可以构建一个数组并在需要时查找它,但我想知道是否有内置函数可以为我执行此操作。我通过 Google 找到的所有示例都使用 ASCII 值,而不是字符在字母表中的位置。
【问题讨论】:
小写字母按 ASCII 字母顺序排列。 连数字 ;-) w3schools.com/charsets/ref_html_ascii.asp 【参考方案1】:假设你想要小写字母:
var chr = String.fromCharCode(97 + n); // where n is 0, 1, 2 ...
97 是小写“a”的 ASCII 码。如果需要大写字母,请将 97 替换为 65(大写“A”)。请注意,如果n > 25
,您将超出字母范围。
【讨论】:
【参考方案2】:在扩展到其他字母的情况下会更便携:
char='abcdefghijklmnopqrstuvwxyz'[code]
或者,为了更兼容(与我们心爱的 IE):
char='abcdefghijklmnopqrstuvwxyz'.charAt(code);
【讨论】:
在我看来比String.fromCharCode
优雅得多,正如你所说,它很容易扩展。
而当你不需要扩展时,也许更容易出错?放弃
仅供参考 JScript (IE) 不支持字符串上的索引运算符 []
。
@Crescent,IE8 以上的 IE 支持字符串上的 []
属性访问器(IE7 兼容模式下的 IE8 也不起作用),首选 String.prototype.chatAt
而不是 []
浏览器兼容性。例如。 'foo'.charAt(0) == 'f'
@Crescent,忘了提到字符串上的 []
属性访问器在 ECMAScript 5 上是标准化的(请参阅 [[GetOwnProperty]](P))。【参考方案3】:
如果您不介意返回多字符串,您可以支持任意正索引:
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
(未彻底测试精度错误:)
【讨论】:
递归函数,很不错! @mikemaccana,为什么要编辑?我认为它使阅读变得更加困难。现在我必须水平滚动才能阅读代码。 @z0r 所以使用代码的人不必修复换行符。没有理由随意换行,编辑器会以窗口的字符大小换行。 好主意,但直到变成这样才起作用:function idOf(i) return (i >= 26 ? idOf(Math.floor(i / 26) -1 ) : '') + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[i % 26];
正是我正在寻找的或【参考方案4】:
一个简单的答案是(26 个字符):
String.fromCharCode(97+n);
如果空间很宝贵,您可以执行以下操作(20 个字符):
(10+n).toString(36);
想想你可以用这些额外的字节做什么!
它的工作原理是将数字转换为以 36 为基数,因此您有以下字符:
0123456789abcdefghijklmnopqrstuvwxyz
^ ^
n n+10
通过偏移 10,字符从 a
开始,而不是 0
。
虽然不完全确定客户端运行这两个不同示例的速度会有多快。
【讨论】:
我喜欢你的 base 36 创意【参考方案5】:我不喜欢所有使用幻数的解决方案,例如 97
或 36
。
const A = 'A'.charCodeAt(0);
let numberToCharacter = number => String.fromCharCode(A + number);
let characterToNumber = character => character.charCodeAt(0) - A;
这假定大写字母并从 0 开始 'A'。
【讨论】:
【参考方案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
【讨论】:
好吧,要学究起来,它需要一个可变个参数,而不是一个无限个数。【参考方案7】:使用String.fromCharCode
。这会从 Unicode 值返回一个字符串,该字符串与 ASCII 的前 128 个字符匹配。
var a = String.fromCharCode(97);
【讨论】:
【参考方案8】:你去:(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 函数。我想它比第一种方法更快(基本上只是查找)。
【讨论】:
这适用于 ASCII,我需要处理字符在字母表中的位置。 @VIVA - 我想你可以解决这个问题吗? @Galambalaza - 我想你想要 65 而不是 64 我只是展示了它是多么简单。他本可以解决这个问题的。但是你去吧。查看更新【参考方案9】:试试
(n+10).toString(36)
chr = n=>(n+10).toString(36);
for(i=0; i<26; i++) console.log(`$i => $ chr(i) `);
【讨论】:
【参考方案10】:@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"
【讨论】:
【参考方案11】:如果您正在寻找 TypeScript 工作函数,请关注
public numericValue = (alphaChar: any) => alphaChar.toUpperCase().charCodeAt(0) - 64;
public alphaValue = (numericDigit: any) =>
String.fromCharCode(64 + numericDigit) : '';
您可以根据要求在函数体内进行多个检查,例如(numericDigit >= 1 && numericDigit <= 26) ?
。
【讨论】:
【参考方案12】:假设你想要大写字母:
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"
【讨论】:
以上是关于将整数转换为其等效字符,其中 0 => a、1 => b 等的主要内容,如果未能解决你的问题,请参考以下文章
Django/Python:如何将整数转换为等效的枚举字符串? [复制]