| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3246 人关注过本帖
标题:【福利贴】【阿拉伯数字小写金额转换成中文大写金额】【给那些需要的人吧】
取消只看楼主 加入收藏
zjy2wyl
Rank: 1
等 级:新手上路
帖 子:12
专家分:1
注 册:2011-8-16
结帖率:100%
收藏
 问题点数:0 回复次数:0 
【福利贴】【阿拉伯数字小写金额转换成中文大写金额】【给那些需要的人吧】
程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>

#define N 30 //30是因为怕数组越界
void rmb_units(int k);
void big_write_num(int l);
void time_print(void);
void main()
    {
        char c[N],*p;
        int a,i,j,len,len_integer=0,len_decimal=0;   //len_integer整数部分长度,len_decimal小数部分长度
        printf("----------------------------------------*---------------------------------------\n");
        printf("*****|-----------*本程序将阿拉伯数字小写金额转换成中文大写金额*-----------|*****\n");
        printf("----------------------------------------*---------------------------------------\n\n");
       
        printf("现在时间为 ");time_print();   //输出当前年月日

        printf("请输入金额小写 (阿拉伯数字): ¥");
        scanf("%s",c);
        printf("\n\n");
        p=c;
        len=strlen(p);

        /*求出整数部分的长度*/
        for(i=0;i<=len-1 && *(p+i)<='9' && *(p+i)>='0';i++);
        if(*(p+i)=='.' || *(p+i)=='\0')   //*(p+i)=='\0'没小数点的情况
            len_integer=i;
        else
            {
               printf("\n\n!!!!---------# Error: 输入有错误,整数部分含有错误的字符!---------!!!!\n\n");
               system("pause");
               exit(EXIT_FAILURE);
            }
        if(len_integer>13)
            {
               printf("!---------------超过范围,最大万亿!整数部分最多位!程序暂停!---------------!\n");
               system("pause");
               printf("\n!---------程序继续执行,注意:超过万亿部分只是简单读出数字的中文大写!----------!\n\n");
            }
        printf("\n===================================转换开始!===================================\n\n");
        printf("¥%s 的中文大写金额如下所示:\n\n人民币/RMB ",c);
       
        /*转换整数部分*/
        for(i=0;i<len_integer;i++)
            {
                a=*(p+i)-'0';
                if(a==0)
                    {
                        if(i==0)
                            {
                                if(*(p+1)!='.' && *(p+1)!='\0' && *(p+1)!='0')
                                    {
                                       printf("\n\n!------------输入有错误!第一位为而后整数部分有非字符,请检查!---=--------!\n\n");
                                       system("pause");
                                       printf("\n!--------------程序继续执行,注意:整数部分的剩下部分将被忽略!----------------!\n\n");
                                    }
                                printf("零圆");
                                break;   //若第一个是则忽略其他整数部分
                            }
                        else if(*(p+i+1)!='0' && i!=len_integer-5 && i!=len_integer-1 && i!=len_integer-9) 
                            //圆、万、亿位时选择不加零                           {
                            {
                                 printf("");
                                 continue;                           
                            }
                       
                        else if(i==len_integer-1 || i==len_integer-5 || i==len_integer-9)   //圆万亿单位不能掉
                            {
                                 rmb_units(len_integer+1-i);
                                 continue;
                            }
                        else
                                 continue;
                     }
               big_write_num(a);              //阿拉伯数字中文大写输出
                rmb_units(len_integer+1-i);   //人民币货币单位中文大写输出
           }
        /*求出小数部分的长度*/
        len_decimal=len-len_integer-1;
        if(len_decimal<0)
            {
                len_decimal=0;
                printf("");   //或正
            }
        if(len_decimal>2)      //只取两位小数
                len_decimal=2;
        //printf("%d----%d-----%d\n",len,len_integer,len_decimal);
        p=c;
        /*转换小数部分*/
        for(j=0;j<len_decimal;j++)    
            {
                a=*(p+len_integer+1+j)-'0';    //定位到小数部分,等价于a=*(p+len-len_decimal+j)-'0';
                if(a<0 || a>9)
                    {
                        printf("\n\n!!!!---------# Error: 输入有错误,小数部分含有错误的字符!---------!!!!\n\n");
                        system("pause");
                        exit(EXIT_FAILURE);
                    }
                if(a==0)
                    {
                        if(j+1<len_decimal)
                         {
                             if(*(p+len_integer+j+2)!='0')      
                                printf("");
                             else
                                {
                                 printf("");
                                 break;
                                 }
                         }
                          continue;
                     }
                big_write_num(a);
                rmb_units(1-j);
            }
        printf("\n\n");
        printf("===================================转换完成!===================================\n\n");
        system("pause");       
    }
   
    /*人民币货币单位中文大写输出*/
    void rmb_units(int k)
      {
         //相当于const char rmb_units[]="fjysbqwsbqisbqw";
         //"分角圆拾佰仟万拾佰仟亿拾佰仟万";
          switch(k)
              {
                   case 3:case 7:case 11: printf("");break;
                   case 4:case 8:case 12: printf("");break;
                   case 5:case 9:case 13: printf("");break;
                   case 6: case 14:       printf("");break;
                   case 10:               printf("亿");break;
                   case 2:                printf("");break;
                   case 1:                printf("");break;
                   case 0:                printf("");break;
                   default:               break;
              }
      }
    /*阿拉伯数字中文大写输出*/
    void big_write_num(int l)
      {
        //相当于const char big_write_num[]="0123456789";
        //"零壹贰叁肆伍陆柒捌玖"
        switch(l)
             {
                  case 0:printf("");break;
                  case 1:printf("");break;
                  case 2:printf("");break;
                  case 3:printf("");break;
                  case 4:printf("");break;
                  case 5:printf("");break;
                  case 6:printf("");break;
                  case 7:printf("");break;
                  case 8:printf("");break;
                  case 9:printf("");break;
                  default:break;
             }
      }
    /*输出当前年月日,相关类型和函数声明参见<time.h>*/
    void time_print(void)
      {
         time_t rawtime;   
         struct tm * timeinfo;
         time ( &rawtime );    //获取时间
         //printf("%d",rawtime);
         timeinfo = localtime ( &rawtime );//转换为当地时间tm结构
         //直接打印tm结构的元素,tm_year从1900年计算,所以要加1900,月tm_mon,从0计算,所以要加1
         printf ( "%d年%02d月%02d日\n\n",1900+timeinfo->tm_year, 1+timeinfo->tm_mon,timeinfo->tm_mday);
      }
搜索更多相关主题的帖子: 中文大写 阿拉伯 
2011-08-21 14:05
快速回复:【福利贴】【阿拉伯数字小写金额转换成中文大写金额】【给那些需要的人 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026758 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved