数字转换为中文汉字

xuetianshi168 2011-03-28 12:52:21
把数字转换为中文汉字:
例如:把78023.28 转换为中文汉字。
...全文
355 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2011-03-31
  • 打赏
  • 举报
回复
汉字UTF8编码是一个汉字3个字节。
dooX8086 2011-03-31
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 zhao4zhong1 的回复:]

引用 15 楼 doox8086 的回复:
引用 14 楼 zhao4zhong1 的回复:

我刚编译运行是对的啊
[/Quote]
哦~~平台问题.
我这里 strlen("汉") = 3, 我修改时漏改了一行 memmove(hznum+i,hznum+i+3,u-i-3+1);
赵4老师 2011-03-31
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 doox8086 的回复:]
引用 14 楼 zhao4zhong1 的回复:
// ..

如果多于2个连续零
如: printf("\n%s\n",ReadNumByHZ(50000000)); // 五千零万零零
[/Quote]
printf("\n%s\n",ReadNumByHZ(50000000));
我刚编译运行是对的啊
50000000
五千零零零万零零零零
五千零万零
五千零万
五千万
五千万

五千万
dooX8086 2011-03-31
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 zhao4zhong1 的回复:]
// ..
[/Quote]
如果多于2个连续零
如: printf("\n%s\n",ReadNumByHZ(50000000)); // 五千零万零零
赵4老师 2011-03-31
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <string.h>
char hznum[100];
char hzunit[15][3]={"","十","百","千","万","十","百","千","亿","十","百","千","万","十","百"};
char hzdigit[10][3]={"零","一","二","三","四","五","六","七","八","九"};
char numstr[20];
char *ReadNumByHZ(double v) {
char *p,*d;
int u,i;

sprintf(numstr,"%.15lg",v);
printf("%s\n",numstr);
if ('-'==numstr[0]) {
sprintf(hznum,"不支持读负数");
return hznum;
}
p=strchr(numstr,'e');
if (NULL!=p) {
sprintf(hznum,"不支持读太大或太小的数");
return hznum;
}
d=NULL;
p=strchr(numstr,'.');
if (NULL!=p) {
p[0]=0;
d=p+1;
}
u=strlen(numstr);
hznum[0]=0;
for (i=0;i<u;i++) {
if ('0'==numstr[i] && 0!=((u-1-i)%4)) {
sprintf(hznum,"%s%s",hznum,hzdigit[numstr[i]-'0']);
} else {
sprintf(hznum,"%s%s%s",hznum,hzdigit[numstr[i]-'0'],hzunit[u-1-i]);
}
}
printf("%s\n",hznum);
u=strlen(hznum);
for (i=0;i<u;i+=2) {
if (0==strncmp(hznum+i,"零零",4)) {//多个连续的“零”改成一个“零”
memmove(hznum+i,hznum+i+2,u-i-2+1);
i-=2;
u-=2;
}
}
printf("%s\n",hznum);
if (0==strcmp(hznum+u-2,"零")) hznum[u-2]=0;//末尾“零”去掉
printf("%s\n",hznum);
u=strlen(hznum);
for (i=0;i<u;i+=2) {
if (0==strncmp(hznum+i,"零万",4) || 0==strncmp(hznum+i,"零亿",4)) {//“万”“亿”前是“零”去掉
memmove(hznum+i,hznum+i+2,u-i-2+1);
u-=2;
}
}
printf("%s\n",hznum);
if (NULL!=d) {
sprintf(hznum,"%s点",hznum);
i=0;
while (1) {
if (0==d[i]) break;
sprintf(hznum,"%s%s",hznum,hzdigit[d[i]-'0']);
i++;
}
}
printf("%s\n",hznum);
return hznum;
}
void main() {
printf("\n%s\n",ReadNumByHZ(130040600090.012));
}
//130040600090.012
//一千三百零零亿四千零六十零万零零九十零
//一千三百零亿四千零六十零万零九十零
//一千三百零亿四千零六十零万零九十
//一千三百亿四千零六十万零九十
//一千三百亿四千零六十万零九十点零一二
//
//一千三百亿四千零六十万零九十点零一二
qq120848369 2011-03-31
  • 打赏
  • 举报
回复
如1003 4060 0090 对应的str="一千零零三亿四千零六十零万零零九十零",

这个万从何而来。算法还是有问题的,能否再考虑一下,给出一个完美的解决方案。
pathuang68 2011-03-29
  • 打赏
  • 举报
回复
这个问题用Interpret模式比较合适。

请参考:
C++实现Behavioral - Interpreter模式

里面的举例是将中文数字转换为阿拉伯数字。
zhanghuayi_xiyou 2011-03-29
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 icerainfc522 的回复:]

定义一个单位结构体或数组Unit{"","十",百,千,万,十,百,千,亿,十,百,千},小数点后直接念Num{"零","一",二,三,。。。。}(注意小数点后末位是0的滤掉),
整数部分转换过程:
pos=0;m=N mod 10,N=N div 10,str="";
while(N>0)
{
m=N mod 10,N=N div 10 //即: m=N-……
[/Quote]

+1
赵4老师 2011-03-29
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 icerainfc522 的回复:]
定义一个单位结构体或数组Unit{"","十",百,千,万,十,百,千,亿,十,百,千},小数点后直接念Num{"零","一",二,三,。。。。}(注意小数点后末位是0的滤掉),
整数部分转换过程:
pos=0;m=N mod 10,N=N div 10,str="";
while(N>0)
{
m=N mod 10,N=N div 10 //即: m=N-N/10*10;N=N……
[/Quote]
支持!
icerainfc522 2011-03-29
  • 打赏
  • 举报
回复
定义一个单位结构体或数组Unit{"","十",百,千,万,十,百,千,亿,十,百,千},小数点后直接念Num{"零","一",二,三,。。。。}(注意小数点后末位是0的滤掉),
整数部分转换过程:
pos=0;m=N mod 10,N=N div 10,str="";
while(N>0)
{
m=N mod 10,N=N div 10 //即: m=N-N/10*10;N=N/10;
if (m==0)
{
str=Num[m]+str;
}
else
{
str=Num[m]+Unit[pos]+str;
}
pos++;
}
然后对str作处理(str是整数部分转换过来的字符串),
(1)如果str字符串中有多个连续的“零”,则改成1个“零”
(2)如果字符串的末尾是“零”,则去掉
(3)如果字符串的“万”“亿”前一个汉字是“零”,则去掉
如1003 4060 0090 对应的str="一千零零三亿四千零六十零万零零九十零",
最后改成 “一千零三亿四千零六十万零九十”
wentian4xiaozhen 2011-03-28
  • 打赏
  • 举报
回复
呵呵,关注中。 得到每位的值通过switch转化成汉字 ,。注意权值的判断,这个应该很容易。。判断有几位就行了嘛》
Philister 2011-03-28
  • 打赏
  • 举报
回复
要睡觉了,楼主打多的话就用switch,先要去整理了
Philister 2011-03-28
  • 打赏
  • 举报
回复
c=getchar();
if(c=='1')
printf("一");
xuetianshi168 2011-03-28
  • 打赏
  • 举报
回复
不写上万千这些,你谁知道那些数字是什么啊?
知道是这样判断啊,但是代码不会写。
luciferisnotsatan 2011-03-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ww884203 的回复:]

如果只是把1变成一,2变成二(壹贰也是一回事)的话很简单,逐个判断逐个添加就行了。
如果还要写上一万两千三百这样的话会麻烦些,不过也不算很麻烦,事先把数字的权判断好就行了。
[/Quote]
+1

ww884203 2011-03-28
  • 打赏
  • 举报
回复
如果只是把1变成一,2变成二(壹贰也是一回事)的话很简单,逐个判断逐个添加就行了。
如果还要写上一万两千三百这样的话会麻烦些,不过也不算很麻烦,事先把数字的权判断好就行了。
c_losed 2011-03-28
  • 打赏
  • 举报
回复
itoa
数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换中文程序数字转换

70,026

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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