最近在封装Excel组件,需要提供两个接口,分别根据单元索引和单元名称访问单元格。例如,GetCell(1, 2)和GetCell(“A2”),这两种方法返回的结果是相同的。这里遇到一个问题,如何在单元索引([1,2])和单元名称(A2)之间相互转换?
由于在单元索引和单元名称中,行号是相同的,所以我们只需要转换列号就可以了。本来以为是个很简单的问题,结果调试了好长时间才搞定。于是写了这篇文章,总结一下。

【问题描述】

在Excel中,列的名称是这样一个递增序列:A、B、C、…、Z、AA、AB、AC、…、AZ、BA、BB、BC、…、BZ、CA、…、ZZ、AAA、AAB…。
我们需要将上述列名序列和以下自然数序列相互转换:1、2、3、…。

【问题分析】

经过分析,我们不难发现,这是一个26进制和十进制相互转换的问题。序列A-Z依次对应序列1-26。进制转换的基本办法就是“取余法”,换算规则如下:
ABZ = 1*26² + 2 * 26¹ + 26*26°= 676 + 52 + 26 = 754
于是,我们就知道该如何设计一个十进制转换为26进制的算法了。

【算法描述】
Step1.[取余] 用指定自然数n除以26,得到一个余数m。如果m = 0,置m←26。
Step2.[转换为字符] 将m映射为字符c,映射规则是{1-26}->{A-Z}。然后将c拼接到26进制值s的左边,也就是置s←c + s。
Step3.[去余降幂] 置n←(n–m)/26。如果n > 0,则回到Step1继续执行,否则进入Step4。
Step4.[结束] 返回s。

按照上述思想,26进制转换为十进制的过程正好是相反的,而且实现起来也更为简单,在此不述。

C#源代码如下:

/// <summary>
/// 将指定的自然数转换为26进制表示。映射关系:[1-26] ->[A-Z]。
/// </summary>
/// <param name="n">自然数(如果无效,则返回空字符串)。</param>
/// <returns>26进制表示。</returns>
public static string ToNumberSystem26(int n){string s = string.Empty;while (n > 0){int m = n % 26;if (m == 0) m = 26;s = (char)(m + 64) + s;n = (n - m) / 26;}return s;
} /// <summary>
/// 将指定的26进制表示转换为自然数。映射关系:[A-Z] ->[1-26]。
/// </summary>
/// <param name="s">26进制表示(如果无效,则返回0)。</param>
/// <returns>自然数。</returns>
public static int FromNumberSystem26(string s){if (string.IsNullOrEmpty(s)) return 0; int n = 0;for (int i = s.Length - 1, j = 1; i >= 0; i--, j *= 26){char c = Char.ToUpper(s[i]);if (c < 'A' || c > 'Z') return 0;n += ((int)c - 64) * j;}return n;
}static void Main(string[] args){int[] numbers = { 1, 10, 26, 27, 256, 702, 703 };foreach (int n in numbers){string s = ToNumberSystem26(n);Console.WriteLine(n + "\t" + s + "\t" + FromNumberSystem26(s));}Console.ReadLine();
}

运行结果如下图所示:

【总结】
一般情况下,各种进制都是以0为起点递增的,例如,八进制(0-7),16进制(0-F)。在本文中,我们设计的26进制是以A为起点的,而不是0,这是主要的不同点。

作者:Lave Zhang
出处:http://www.cnblogs.com/lavezhang/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

十进制与26进制英文字母互转相关推荐

  1. 十进制和26进制转换算法

    [问题描述] 在Excel中,列的名称是这样一个递增序列:A.B.C.-.Z.AA.AB.AC.-.AZ.BA.BB.BC.-.BZ.CA.-.ZZ.AAA.AAB-. 我们需要将上述列名序列和以下自 ...

  2. 笔记:JS仿excel十进制和26进制转换算法

    笔记:JS仿excel十进制和26进制转换算法 引子:看过这篇文章用C#实现的十进制和26进制转换算法,觉得在前端以后会用到,遂改写出Javacript的写法. 十进制转26进制: function ...

  3. 26进制(字母)转十进制算法

    下面是一个26进制转十进制的算法,目的是将字母(A~Z)转化为十进制的数字.主要用途是为了解决使用phpExcel解析Excel表格的时候,在Excel表格中列是由字母表示的,而很多情况下我们需要了解 ...

  4. 十进制和26进制字母相互转换

    //10进制转字母(26)进制 function decimal2ABC($num){     $ABCstr = "";     $ten = $num;     if($ten ...

  5. 十进制转与26进制的相互转换

    十进制转与26进制的相互转换 /*** 将十进制转换为26进制* @param {Number} num 十进制数* @param {Bolean} isUpper 是否输出为大写, 默认为小写*/ ...

  6. leetcode 168. Excel表列名称(10进制转26进制)

    题目 思路 10进制转26进制 经过分析,我们不难发现,这是一个26进制和十进制相互转换的问题.序列A-Z依次对应序列1-26.进制转换的基本办法就是"取余法",换算规则如下: A ...

  7. 26英文字母加减26进制转换

    package com.chinait.utils; /*** 算法输出(A后面的多少位的字符串,超过Z 则改为 AA 开始),相当于用26进制的加法过程,但是是由英文字母来定义的,使用场景在于处理e ...

  8. 每天一道LeetCode-----将数字用字母表示(本质是26进制转换)

    Excel Sheet Column Title 原题链接Excel Sheet Column Title 讲数字转为字母'A'到'Z'表示,对应关系如图 思路: 本质上是将10尽职转为26进制,不同 ...

  9. 数字 和 大小写字母之间的转换 10进制和26进制之间的转换

    /** 数字转大写字母(26进制)1->A 2->B* @since JDK 1.8 */public static String numCovertLetter(int num) {if ...

最新文章

  1. opencv nms 学习笔记
  2. python论坛签到_论坛自动签到教程
  3. 取后端数据_用 Flask+Axios 实现前后端数据通信:查询动森鱼类价格
  4. 随手练——HDU-2037 、P-2920 时间安排(贪心)
  5. python中类的构成_Python类的构成元素
  6. Flutter实战一Flutter聊天应用(九)
  7. Exchange 2013 创建新用户
  8. HelloKafka入门 helloKafka
  9. JS function 函数基本定义方法
  10. 用jmap和jps查看对象数量
  11. 细数国内外的哪些数学建模竞赛
  12. codeforces 707c
  13. 按键精灵-5-按键精灵控制脚本流程2
  14. ros软路由防火墙(双线路、日志配置)
  15. 历史的味道(美国人拍摄的1974-1978年中国)
  16. 华三交换机配置vrrp_华三交换机 VRRP V7版本
  17. MySQL数据字典提示1146不存在的问题解决
  18. 如何计算机闲置虚拟机算法_利用闲置计算机的最佳方法
  19. 为什么会用到浅拷贝和深拷贝
  20. 浅析Trafodion体系结构

热门文章

  1. 通过 languagereactor 浏览器插件学英语
  2. 矩阵乘法优化之分块矩阵
  3. 百度地图定位和IP地址定位
  4. python 计算DataFrame的数值变量及离散变量,并标准化
  5. php仿百度贴吧源码,众大一键采集百度贴吧内容 php版 v5.0
  6. 听说你想了解微服务架构
  7. SignalR服务器端消息推送
  8. 企业信息化管理:SaaS软件or传统软件如何选择?
  9. SSH酒店点菜系统笔记
  10. web优化之YSlow的使用