joken-前端工程师

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: :: :: 管理 ::
  394 随笔 :: 39 文章 :: 8 评论 :: 20万 阅读

在 JavaScript 中,将数字转换为类似 Excel 列的字母(如 1 -> A, 2 -> B, ..., 26 -> Z, 27 -> AA 等)需要实现一个进制转换的逻辑。Excel 列的字母本质上是一个 26 进制的表示方式,但没有“0”,从 1 开始计数。以下是实现这个转换的几种方法:

方法 1:递归方式

这是一个简洁且易理解的实现:

function numberToExcelColumn(num) {
    if (num <= 0) return ''; // 处理无效输入

    const letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    num--; // 因为 Excel 从 1 开始,我们从 0 计算方便
    const quotient = Math.floor(num / 26);
    const remainder = num % 26;

    if (quotient === 0) {
        return letters[remainder];
    } else {
        return numberToExcelColumn(quotient) + letters[remainder];
    }
}

// 测试
console.log(numberToExcelColumn(1));  // "A"
console.log(numberToExcelColumn(2));  // "B"
console.log(numberToExcelColumn(26)); // "Z"
console.log(numberToExcelColumn(27)); // "AA"
console.log(numberToExcelColumn(52)); // "AZ"
console.log(numberToExcelColumn(53)); // "BA"
console.log(numberToExcelColumn(702)); // "ZZ"
console.log(numberToExcelColumn(703)); // "AAA"

原理:

  • 将数字减 1(因为 A 是 1,不是 0)。
  • 用 26 取模得到当前位的字母(0 -> A, 1 -> B, ...)。
  • 用除法递归处理高位,直到商为 0。

方法 2:迭代方式

如果你不喜欢递归,可以用循环的方式实现:

function numberToExcelColumn(num) {
    if (num <= 0) return ''; // 处理无效输入

    const letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    let result = '';

    while (num > 0) {
        num--; // 调整为从 0 开始计数
        result = letters[num % 26] + result;
        num = Math.floor(num / 26);
    }

    return result;
}

// 测试
console.log(numberToExcelColumn(1));  // "A"
console.log(numberToExcelColumn(26)); // "Z"
console.log(numberToExcelColumn(27)); // "AA"
console.log(numberToExcelColumn(702)); // "ZZ"
console.log(numberToExcelColumn(703)); // "AAA"

原理:

  • 每次取模得到当前位的字母,添加到结果前面。
  • 除以 26 处理下一位,重复直到数字为 0。

注意事项

  1. 输入范围:以上代码假设输入是正整数。如果需要处理更大的范围或负数,可以根据需求调整。
  2. 性能:对于大部分应用场景,这两种方法的性能都足够好。迭代方式可能在极大数据时略快于递归。
  3. 大小写:Excel 列字母通常是大写。如果需要小写,可以改用 'abcdefghijklmnopqrstuvwxyz'

反向转换(字母转数字)

如果你还想知道如何将 Excel 列字母转回数字,这里也顺便给个实现:

function excelColumnToNumber(column) {
    return column.split('').reduce((num, char) => {
        return num * 26 + (char.charCodeAt(0) - 'A'.charCodeAt(0) + 1);
    }, 0);
}

// 测试
console.log(excelColumnToNumber('A'));   // 1
console.log(excelColumnToNumber('Z'));   // 26
console.log(excelColumnToNumber('AA'));  // 27
console.log(excelColumnToNumber('AZ'));  // 52
console.log(excelColumnToNumber('ZZ'));  // 702
console.log(excelColumnToNumber('AAA')); // 703

原理:

  • 将字母视为 26 进制数,每位乘以 26 的幂次,从右到左计算。

哪个方法适合你?

  • 如果代码简洁优先,选递归方式
  • 如果性能或可读性优先,选迭代方式
posted on   joken1310  阅读(1)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
点击右上角即可分享
微信分享提示