【问题标题】:Convert number to alphabet string (Javascript)将数字转换为字母字符串(Javascript)
【发布时间】:2017-08-20 22:48:44
【问题描述】:

我想将数字转换为字符,例如:

  • 如果数字 = 1 那么 A
  • 如果数字 = 26 那么 Z
  • 如果数字 = 27 则 AA
  • 如果数字 = 676 那么 ZZ
  • 如果数字 = 456976 那么 ZZZZ

试图找到任何可以帮助我的东西,但我没有任何运气。有人有使用 JavaScript 的示例吗?

谢谢!

【问题讨论】:

  • 0 怎么样? (如何) 你会转换它吗?
  • 这毫无意义。只能用 A 和 Z 完成吗?还是那些只是“极端案例”?你怎么得到AB?德? XYZ?
  • 这里的逻辑在哪里 ( 26 + 1 == AA ) && (26 * 26 == ZZ) ?

标签: javascript data-conversion


【解决方案1】:

您显示的数字转换似乎不一致。您似乎想将数字转换为等效的电子表格列字母,类似于以下 Python 问题:Convert spreadsheet number to column letter

将该代码转换为 javascript(并稍微清理一下)给出:

function numToSSColumn(num){
  var s = '', t;

  while (num > 0) {
    t = (num - 1) % 26;
    s = String.fromCharCode(65 + t) + s;
    num = (num - t)/26 | 0;
  }
  return s || undefined;
}


// A  Z AA  CZ  DA  YZ  ZZ AAA
[0,1,26,27,104,105,676,702,703,
//AAZ ABA  AZZ  BAA  BAZ  BBA   YYYZ   ZZZZ
  728,729,1378,1379,1404,1405,456976,475254].forEach(function(n) {
  console.log(n + ' : ' + numToSSColumn(n));
});

函数不检查输入,如果n < 0 则返回undefined

您的转换似乎不起作用,因为电子表格的列不是从 0 开始,而是从 1 开始,所以 A-Z 是 1 到 26,AA 到 AZ 是 27 到 52,依此类推。 676 是 YZ,456976 是 YYYZ。 ZZZZ 是 475254(或 11110 base26);

【讨论】:

    【解决方案2】:

    你需要编写一个循环,每次通过 26 对数字进行 mod (%) 并使用以下命令:

     String.fromCharCode(num + 64) // if num is 1 then result is 'A'
    

    【讨论】:

      【解决方案3】:

      我用递归写了一个解决方案,嗯...只是为了好玩:)

      const numberToBase26 = (val, tail = '') => {
        if (val <= 26) {
          return `${String.fromCharCode(val + 64)}${tail}`;
        }
      
        const remainder = val % 26 || 26;
        const division = Math.trunc(val / 26) - (remainder === 26 ? 1 : 0);
      
        return numberToBase26(division, `${String.fromCharCode(remainder + 64)}${tail}`);
      };
      
      console.log(numberToBase26(475254), ' should be equal to ZZZZ');

      【讨论】:

        【解决方案4】:

        你有非常奇怪的案例,很难理解。如果27 = AA,则52 = ZZ,但根据您的示例676 = ZZ。您能否详细说明您要生成的系列。 以防万一以下是满足我的示例的算法:

        getAlphabetFromNumber = function (_num) {
            var str = "";
        
            multiples = Math.ceil(_num / 26);
            _charAtCode = _num - ((multiples - 1) * 26)
        
            for (let i = 0; i < multiples; i++)
                str += String.fromCharCode(_charAtCode + 64);
        
            return str;
        }
        

        【讨论】:

          【解决方案5】:

          重要的部分是 charCodeAt,它返回任何字符的 ASCII 值。

          function columnIndex(name) {
              let index = 0;
          
              name = name.toUpperCase().split('');
          
              for (let i = name.length - 1; i >= 0; i--) {
                  let piece = name[i];
                  let colNumber = piece.charCodeAt() - 64;
                  index = index + colNumber * Number(Math.pow(26, name.length - (i + 1)));
              }
          
              return index;
          }
          
          ['A', 'AA', 'AAA', 'AAB', 'MMMM', 'MMMN'].forEach((n) => {
              console.log(n + ' : ' + columnIndex(n));
          });

          【讨论】:

            【解决方案6】:

            这是一个开始,打开你的检查器,选择控制台。并将其粘贴到:

            cvt = function(n) {return(String.fromCharCode(n+'A'.charCodeAt(0)-1))}

            现在您可以输入cvt(1) 来获取“A”,或输入cvt(26) 来获取“Z”

            它只适用于一个角色。剩下的就交给你了

            【讨论】:

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