⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 小写数字转换成大写数字2.c

📁 C语言源码
💻 C
字号:
/***  程序: 123.45    则输出“壹佰贰拾叁点肆伍” ***/


#include <stdio.h>  /*标准输入输出函数*/
#include <string.h>  /*字符串函数*/
#include <stdlib.h>  

void ConvertN(int n,char* &p,bool IsSequece=true);  /*声明函数ConvertN*/
bool ConvertSegment(int number,int n,char* &p,bool IsLastZiero); /*声明函数ConvertSegment*/
bool ChangeNumber(double dbNumber,char* lpszvalues);  /*声明函数ChangeNumber*/

void main() 
{ 
 double db=-1200008.9876; 
 printf("%lf\n",db); 
 char buf[100]; 
 if(ChangeNumber(db,buf)) 
   printf("%s\n",buf); 

 db=1000000.98; 
 printf("%lf\n",db); 
 if(ChangeNumber(db,buf)) 
   printf("%s\n",buf); 

 db=10000008.0987; 
 printf("%lf\n",db); 
 if(ChangeNumber(db,buf)) 
   printf("%s\n",buf); 

 db=10200408.09007; 
 printf("%lf\n",db); 
 if(ChangeNumber(db,buf)) 
   printf("%s\n",buf); 

 db=10020400.007; 
 printf("%lf\n",db); 
 if(ChangeNumber(db,buf)) 
   printf("%s\n",buf); 
} 

void ConvertN(int n,char* &p,bool IsSequece/*=true*/) 
/*定义函数ConvertN
 "小数位转换" 将数字n(0<=n<=9)转换成中文后存入p,IsSequece控制存放顺序 */
{ 
 if(n<0 || n>9)   
 { 
   printf("Error:数组超界!\n");   /*如果超过界限就输出错误*/
   exit(0);    /*跳出函数*/
 } 

 char num[]="零壹贰叁肆伍陆柒捌玖"; 
 if(IsSequece)                         /*如果IsSequece为真就顺序存放*/
 { 
   *p++=num[2*n]; 			/*因为汉字是双字节的所以,在把阿拉伯数字转化时比如0对应的零是双字节,占数组的0和1的位置,其他的以此类推*/
   *p++=num[2*n+1]; 
 } 
 else                                  /*如果IsSequece为非即反序存放*/
 { 
   *p++=num[2*n+1]; 
   *p++=num[2*n]; 
 } 
} 

bool ConvertSegment(int number,int n,char* &p,bool IsLastZiero) 
/*定义函数 ConvertSegment
 "整数位转换" 将number转换成中文后反序存入字符指针p 
number为某数整数部分的第n节(由低位到高位从个位开始每4位为一节,n从0开始) */
{ 
 char num1[]="  拾佰仟"; 
 char num2[]="点万亿兆"; 

 if(number==0) 
 { 
   if(n==0) 
   { 
     *p++=num2[2*n+1]; 
     *p++=num2[2*n]; 
   } 
   return IsLastZiero; 
 } 

 if(IsLastZiero) 
 { 
   ConvertN(0,p,false); 
 } 

 *p++=num2[2*n+1]; 
 *p++=num2[2*n]; 

 bool flag=true;                      /* 前面是否有零 */
 for(int i=0;number!=0 && i<4;i++) 
 { 
   int m; 
   m=number%10; 
   if(m==0 && !flag) 
   { 
     flag=true; 
     ConvertN(0,p,false); 
   } 
   else if(m!=0) 
   { 
     flag=false; 
     if(i==0) 
     { 
       ConvertN(m,p,false); 
     } 
     else 
     { 
       *p++=num1[2*i+1]; 
       *p++=num1[2*i]; 
       ConvertN(m,p,false); 
     } 
   } 
   number/=10; 
 } 

 if(i>=4) 
   return false; 
 else 
   return true; 

} 

bool ChangeNumber(double dbNumber,char* lpszvalues)  
{ 
 /*定义函数 ChangeNumber	
   整数部分最多8位,小数部分最多6位 */
 if(dbNumber<0.0000001 && -dbNumber<0.0000001)                    //数位太小 
 { 
   strcmp(lpszvalues,"零"); 
   return true; 
 } 
 if(dbNumber>100000000L || -dbNumber>100000000L)                  //数位太大 
   return false; 

 /* 开始处理 */
 char buf1[50],buf2[50],*p1=buf1,*p2=buf2; /* 结果的整数部分和小数部分缓冲区 */
 /* p1是整数指针 p2是小数指针 */
 double c=dbNumber; 
 c=c>0?c:-c; 
 /*取得大实数的整数部分和小数部分并非易事,long的长度直接限制了整数部分的长度, 
   除非构造出更大的整数或直接利用实数计算,否则难以办到! 
   此外受实数精度的影响,有时会导致小数部分的畸形! 
   精请高手指点!!! 
 */ 
 unsigned long a=(unsigned long)c;         /*整数部分*/
 double b=c-a;                             /*小数部分*/
 /*printf("%lu\n",a); 
   printf("%lf\n",b); 
   printf("%lf\n",c);*/
  
 /* 处理小数部分 */
 for(int i=0;i<6;i++) 
 { 
   b*=10;  		/*将小数最高位向前进一位取得整数*/
   int n=int(b); 	
   ConvertN(n,p2);    /*转换成字符数值*/
   b-=n;      /*减去整数部分的数取得下一位小数,将其成为整数*/
 } 
 *p2='\0';

 /* 处理整数部分 */
 int count=0; 
 bool flag=false; 
 while(a!=0) 
 { 
   int buf=a%10000; 
   flag=ConvertSegment(buf,count++,p1,flag); 
   a/=10000; 
 } 

 /*是否有负号 */
 char *p=lpszvalues; 
 if(dbNumber<0) 
 { 
   strcpy(p,"负"); 
   p+=2; 
 } 

 /* 连接整数部分和小数部分 */
 p1--; 
 while(p1>=buf1) 
   *p++=*p1--; 
 *p='\0'; 
 strcat(lpszvalues,buf2); 

 return true; 
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -