数字转化成字母的一个问题

cruiser332 2008-11-20 11:31:13
现在在用C++来控制excel,在做的过程中遇到了这样一个问题:

知道了excel的某一个列的number,怎么能将它转成excel的“ABCD…”的表示形式,

换句话说就是,我现知道了要写第7列数据,可怎么能将7转成"G",
大家有什么好办法吗? 我要写的数据很大,怎么来写这个转化的函数啊?
我不可能自己写case来判断,excel中的列是A~Z,AA~AZ,BA~BZ……
...全文
362 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tcs_win 2008-11-21
  • 打赏
  • 举报
回复
#include "stdafx.h"
#include "iostream"
using namespace std;
int _changfun(int digit, int x);
int main()
{
int data;
int num;
printf("please input data: num:\n");
scanf("%d%d",&data,&num);
data=_changfun(data,num);
printf("%d",data);
}
int _changfun(int digit,int x)
{
int temp[100];
int newdata = 0;
for (int i = 0;digit>0;i++)
{
temp[i] = digit%10;
for (int j = 0;j<i;j++)
{
temp[i] = temp[i]*x;
}
digit = digit/10;
newdata += temp[i];

}
return newdata;
}
ForestDB 2008-11-21
  • 打赏
  • 举报
回复
把10进制数转换成26进制数,然后做1到26至'A'到'Z'的映射。
当然这里的进制和平常理解的满10进1,进位为1,本位置0,有点小区别,它是满26不进,过26进且仅进位为1本位不置0置1,即
1 -> A
2 -> B
...
26 -> Z // 满26不进
27 -> AA
...

#include <stdio.h>

void convert(int n)
{
static int s[100] = { 0 };
int *base = s, *top = s;
int remain = 0;

while(n)
{
remain = n % 26;
if(remain == 0)
{
remain = 26;
n -= 26;
}
*top++ = remain;
n /= 26;
}

while(top != base)
{
putchar('A' - 1 + *--top);
}
putchar('\n');
}

int main(void)
{
int i;
for(i = 1; i <= 1000; ++i)
convert(i);

return 0;
}
太乙 2008-11-20
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 cruiser332 的回复:]
回楼上的几位朋友:
“G”我只是举个例子,要我现在想写第158列的数据,怎么得到列的ASC的值?
我现在是要写那一列自己是不知道的,需要从别的文件中读出来
[/Quote]

自己写个函数,算算不就明白了!
kindo 2008-11-20
  • 打赏
  • 举报
回复
用16进制试试看。
cruiser332 2008-11-20
  • 打赏
  • 举报
回复
回楼上的几位朋友:
“G”我只是举个例子,要我现在想写第158列的数据,怎么得到列的ASC的值?
我现在是要写那一列自己是不知道的,需要从别的文件中读出来
homesos 2008-11-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 cyj626 的回复:]
"G"="A"+7
[/Quote]
直接在使用A+NUM
cyj626 2008-11-20
  • 打赏
  • 举报
回复
"G"="A"+7
cyj626 2008-11-20
  • 打赏
  • 举报
回复
strcmp


原型:extern int strcmp(char *s1,char * s2);
  用法:#include <string.h>
  功能:比较字符串s1和s2。
  说明:
  当s1<s2时,返回值<0
  当s1=s2时,返回值=0
  当s1>s2时,返回值>0
就呆在云上 2008-11-20
  • 打赏
  • 举报
回复
like this:
int main() 
{
int a = 100100;
char b[10];
sprintf(b, "%d", a);
printf(b); //output 100100
}
cyj626 2008-11-20
  • 打赏
  • 举报
回复
可以用字符 "G”-“A”来计算啊
或者用字符比较函数试试
Kinglin_sky 2008-11-20
  • 打赏
  • 举报
回复
自己些个函数,把10进制转换成26进制就好了!
宇宙使者2017 2008-11-20
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 Murder9527 的回复:]
把26进制转换为10进制。
[/Quote]
对头
葫芦鬼 2008-11-20
  • 打赏
  • 举报
回复
把26进制转换为10进制。
sxlengwa 2008-11-20
  • 打赏
  • 举报
回复


int value; //第 value 列
char col_name[5]; //存储最后的列名

{
int i, count = 0;
char tmp[5];

memset(col_name, 0, sizeof(col_name));
while (value > 0)
{
if (value % 26 == 0)
{
tmp[count++] = 'Z';
value = value / 26 - 1;
}
else
{
tmp[count++] = 'A' - 1 + (value % 26);
value = value / 26;
}
}

for (i=0; i<count; i++)
{
col_name[i] = tmp[count-i-1];
}
}
yndfcd 2008-11-20
  • 打赏
  • 举报
回复
char*[] = { "A", "B", ..., "IV" };//excel最多IV列.

当然,手动写这个表很方便,可以写一段代码来搞.

char Table[256][3];

void InitTable()
{
int i = 0;
while( i < 26 )
{
Table[i][0] = 'A' + i++;
Table[i][1] = 0;
}
char h = 0,l = 0;
while( i < 256 )
{
Table[i][0] = 'A' + h;
Table[i][1] = 'A' + l;
if( l++ == 25 )
{
l = 0;
h++;
}
Table[i][3] = 0;

i += 1;
}
}

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧