You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

正整数与类Excel字母索引的双向转换方法问询

正整数与Excel式字母索引的双向转换实现

我需要实现一套正整数与类Excel列标签的字母索引双向转换逻辑,用于排序、范围大小计算等场景。这套索引规则是:A=1,B=2……Z=26,AA=27,AB=28……ZZ=702,AAA=703,以此类推。注意这不是普通的十进制转26进制——普通26进制中A代表0,AA等价于0,26会被转换为BA,完全不符合需求。

一、字母索引转正整数

这个逻辑比较直观,遍历字符串的每个字符,按位加权求和即可。每个字符对应数值为ord(c) - ord('A') + 1(A=1,Z=26),每一位的权重是26的幂次,从左到右依次计算:

def letters_to_number(s):
    num = 0
    for c in s.upper():
        num = num * 26 + (ord(c) - ord('A') + 1)
    return num

示例:输入"ABC",计算过程为0*26+1=1 → 1*26+2=28 → 28*26+3=731,返回结果731,对应第731个字母索引。

二、正整数转字母索引(核心实现)

这部分是难点,普通进制转换无法直接套用。我设计了一套处理余数的算法,解决了26对应Z、27对应AA这类特殊情况:

算法思路

  1. 初始化空列表存储结果字符
  2. 循环处理输入整数n,直到n变为0:
    • 计算n % 26得到余数
    • 若余数为0,说明当前位是Z,将Z加入列表,同时n = (n // 26) - 1(因为Z占用了26的位置,需要向前借一位)
    • 若余数不为0,将余数对应的字母(A+余数-1)加入列表,n = n // 26
  3. 反转列表拼接成字符串,得到最终的字母索引

代码实现

def number_to_letters(n):
    letters = []
    while n > 0:
        remainder = n % 26
        if remainder == 0:
            letters.append('Z')
            n = (n // 26) - 1
        else:
            letters.append(chr(ord('A') + remainder - 1))
            n = n // 26
    return ''.join(reversed(letters))

示例验证:

  • 输入731:731%26=3→加C,n=28;28%26=2→加B,n=1;1%26=1→加A,n=0;反转得到ABC
  • 输入26:26%26=0→加Z,n=0;返回Z
  • 输入27:27%26=1→加A,n=1;1%26=1→加A,n=0;返回AA

说明

该实现为通用场景设计,逻辑与Excel列名转换一致,但不受限于Excel环境,可直接用于任何需要此类字母索引的系统中。

内容的提问来源于stack exchange,提问作者Ethan Maness

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 00:05:21