将整数转换为其等效字符,其中 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】:

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

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 &gt;= 1 &amp;&amp; numericDigit &lt;= 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 等的主要内容,如果未能解决你的问题,请参考以下文章

如何将字符串转换为其等效的 LINQ 表达式树?

将加密/解密转换为其 PHP 等效项

Django/Python:如何将整数转换为等效的枚举字符串? [复制]

Django/Python:如何将整数转换为等效的枚举字符串? [复制]

c/c++将整数转换为字符串

(3)编写一个函数atoi,其作用是将一个整数字符串转换成一个整数.要求函数调用形式为