朋友有一个简单的需求,就是对EXCEL上的表头进行加法,以定位到具体位置,
具体如下:
A+1=B,Z+A=AA,AZZ+1=BAA
由与是A~Z,考虑使用26进制,唯一不能使用的是0 因为excel上列的范围是 A~XFD
闲来无事,就写了一下,顺便没有考虑最大为XFD的范围,代码实现如下
// 进制转换 A~Z字符转换为10进制
long Convert(CString &str)
{
long lLength = str.GetLength();
long lData(0),lTotal(0);
for(long i=0;i<lLength;++i)
{
lData = str[i] - _T('A')+1; //最小值不能为0,因此设置为1
lTotal = lTotal *26+lData;
}
return lTotal;
}
//10进制转换为 A~Z字符
void Convert(CString& strDest,long lNum)
{
strDest.Empty();
long lM(0);
if(lNum==0)
strDest = _T('A');
else if(lNum<0)
return ;
TCHAR chData;
while(lNum!=0)
{
lM = lNum%26;
lNum = lNum/26;
if(lM==0) //由于'Z'就是第26,这里采取直接赋值,并且不能进位。
{
chData = _T('Z');
lNum -= 1;
}
else
chData = _T('A') + lM-1; //之前最小值设置为1了,这里要减去1
strDest.Insert(0,chData);
}
}
void GetAddString(CString& strDest,CString &strSrc,long lNum)
{
long lTotal = Convert(str);
lTotal += lNum;
Convert(strDest,lTotal);
}
测试用例里面可以直接使用 GetAddString
int main()
{
CString str1(_T("AZZ"));
CString str2(_T("AA"));
CString strDest;
GetAddString(strDest,str1,1); //AZZ+1 结果为BAA
GetAddString(strDest,str1,Convert(str2)); //AZZ+AA 结果为BBA
return 0;
}