【问题标题】:Convert numbers to letters beyond the 26 character alphabet将数字转换为 26 个字符以外的字母
【发布时间】:2011-11-23 10:29:09
【问题描述】:

我正在为可映射的电子表格导出功能创建一些客户端函数。

我使用 jQuery 来管理列的排序顺序,但每一列的排序就像 Excel 电子表格一样,即 a b c d e......x y z aa ab ac ad 等

如何将数字生成为字母?我应该定义一个固定的值数组吗?或者有没有一种动态的方式来生成这个?

【问题讨论】:

    标签: javascript jquery


    【解决方案1】:

    这是一个非常简单的方法:

    function numberToLetters(num) {
        let letters = ''
        while (num >= 0) {
            letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[num % 26] + letters
            num = Math.floor(num / 26) - 1
        }
        return letters
    }
    

    【讨论】:

    • 这在 701 以上不起作用。但话说回来,我什至不知道列是否可以到达 AAA
    • @Cooper 它有效。对于 701,返回“ZZ”,对于 702,返回“AAA”。然后依次为:“AAB”、“AAC”。与 Excel 相同。
    【解决方案2】:
    function getColumnDescription(i) {
      const m = i % 26;
      const c = String.fromCharCode(65 + m);
      const r = i - m;
      return r > 0
        ? `${getColumnDescription((r - 1) / 26)}${c}`
        : `Column ${c}`
    }
    

    用法:

    getColumnDescription(15)
    "Column P"
    
    getColumnDescription(26)
    "Column AA"
    
    getColumnDescription(4460)
    "Column FOO"
    
    

    【讨论】:

      【解决方案3】:

      我认为您正在寻找类似的东西

          function colName(n) {
              var ordA = 'a'.charCodeAt(0);
              var ordZ = 'z'.charCodeAt(0);
              var len = ordZ - ordA + 1;
            
              var s = "";
              while(n >= 0) {
                  s = String.fromCharCode(n % len + ordA) + s;
                  n = Math.floor(n / len) - 1;
              }
              return s;
          }
      
      // Example:
      
          for(n = 0; n < 125; n++)
                  document.write(n + ":" + colName(n) + "<br>");

      【讨论】:

      • 很好的答案,但我希望看到它背后的解释。 97 之类的东西代表小“a”等。
      • @georg 你能解释一下基本转换是如何工作的吗?我的意思是为什么n = Math.floor(n / len) - 1?你为什么在这里减去1?我很难理解背后的想法。我在这里和那里阅读了几个答案,但不明白它为什么起作用。请解释:)
      • @YaseenMollik:嗨,请参阅 stackoverflow.com/a/8798330/989121 以获得很好的解释。
      • Math.floor() 是一个浮点运算,上面也已经计算了 n%len,那行是n = (n - n%len) / len -1;。在这个用例中,这不是性能问题,但从我的角度来看,它更容易阅读,因为没有使用 FPU op 来获取 int
      【解决方案4】:

      如果您将数据保存在二维数组中,例如

      var data = [
        ['Day', 'score],
        ['Monday', 99],
      ];
      

      您可以将行/列映射到电子表格单元格编号,如下所示(基于上面的代码示例):

      function getSpreadSheetCellNumber(row, column) {
        let result = '';
      
        // Get spreadsheet column letter
        let n = column;
        while (n >= 0) {
          result = String.fromCharCode(n % 26 + 65) + result;
          n = Math.floor(n / 26) - 1;
        }
      
        // Get spreadsheet row number
        result += `${row + 1}`;
      
        return result;
      };
      

      例如data[0][0] 中的“Day”值将进入电子表格单元格 A1。

      > getSpreadSheetCellNumber(0, 0)
      > "A1"
      

      当您有 26 列以上时,这也适用:

      > getSpreadSheetCellNumber(0, 26)
      > "AA1"
      

      【讨论】:

        【解决方案5】:

        简单的递归解决方案:

        function numberToColumn(n) {
          const res = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[n % 26];
          return n >= 26 ? numberToColumn(Math.floor(n / 26) - 1) + res : res;
        }
        

        【讨论】:

          【解决方案6】:

          您可以使用这样的代码,假设numbers 包含您的列数。因此,在此代码之后,您将获得列的字符串名称:

          var letters = ['a', 'b', 'c', ..., 'z'];
          var numbers = [1, 2, 3, ...];
          var columnNames = [];
          for(var i=0;i<numbers.length;i++) {
              var firstLetter = parseInt(i/letters.length) == 0 ? '' : letters[parseInt(i/letters.length)];
              var secondLetter = letters[i%letters.length-1];
              columnNames.push(firstLetter + secondLetter);
          }
          

          【讨论】:

          • 谢谢。这很好用,但它不仅仅以单个字符开头,即 a、b、c、d....x、y、z、aa、ab、ac?
          【解决方案7】:

          这涵盖了从 1 到 1000 的范围。超出的范围我没有检查。

          function colToletters(num) {
            let a = " ABCDEFGHIJKLMNOPQRSTUVWXYZ";
            if (num < 27) return a[num % a.length];
            if (num > 26) {
              num--;
              let letters = ''
              while (num >= 0) {
                letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[num % 26] + letters
                num = Math.floor(num / 26) - 1
              }
              return letters;
            }
          }
          

          我可能是错的,但我检查了这个答案中的其他函数,它们似乎在 26 处失败,应该是 Z。记住字母表中有 26 个字母而不是 25。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-07-07
            相关资源
            最近更新 更多