【问题标题】:Convert integer into its character equivalent, where 0 => a, 1 => b, etc将整数转换为其等效字符,其中 0 => a、1 => b 等
【发布时间】:2011-03-09 20:54:21
【问题描述】:

我想根据字母表将整数转换为其等效字符。例如:

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

等等。我可以构建一个数组并在需要时查找它,但我想知道是否有内置函数可以为我执行此操作。我通过 Google 找到的所有示例都使用 ASCII 值,而不是字符在字母表中的位置。

【问题讨论】:

标签: javascript integer alphabet


【解决方案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"

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2019-11-24
                • 2010-10-07
                • 2010-09-13
                • 2011-10-06
                • 2011-07-05
                • 2010-11-08
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多