?? 小寫數(shù)字轉(zhuǎn)換成大寫數(shù)字2.c
字號:
/*** 程序: 123.45 則輸出“壹佰貳拾叁點肆伍” ***/
#include <stdio.h> /*標準輸入輸出函數(shù)*/
#include <string.h> /*字符串函數(shù)*/
#include <stdlib.h>
void ConvertN(int n,char* &p,bool IsSequece=true); /*聲明函數(shù)ConvertN*/
bool ConvertSegment(int number,int n,char* &p,bool IsLastZiero); /*聲明函數(shù)ConvertSegment*/
bool ChangeNumber(double dbNumber,char* lpszvalues); /*聲明函數(shù)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*/)
/*定義函數(shù)ConvertN
"小數(shù)位轉(zhuǎn)換" 將數(shù)字n(0<=n<=9)轉(zhuǎn)換成中文后存入p,IsSequece控制存放順序 */
{
if(n<0 || n>9)
{
printf("Error:數(shù)組超界!\n"); /*如果超過界限就輸出錯誤*/
exit(0); /*跳出函數(shù)*/
}
char num[]="零壹貳叁肆伍陸柒捌玖";
if(IsSequece) /*如果IsSequece為真就順序存放*/
{
*p++=num[2*n]; /*因為漢字是雙字節(jié)的所以,在把阿拉伯數(shù)字轉(zhuǎn)化時比如0對應的零是雙字節(jié),占數(shù)組的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)
/*定義函數(shù) ConvertSegment
"整數(shù)位轉(zhuǎn)換" 將number轉(zhuǎn)換成中文后反序存入字符指針p
number為某數(shù)整數(shù)部分的第n節(jié)(由低位到高位從個位開始每4位為一節(jié),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)
{
/*定義函數(shù) ChangeNumber
整數(shù)部分最多8位,小數(shù)部分最多6位 */
if(dbNumber<0.0000001 && -dbNumber<0.0000001) //數(shù)位太小
{
strcmp(lpszvalues,"零");
return true;
}
if(dbNumber>100000000L || -dbNumber>100000000L) //數(shù)位太大
return false;
/* 開始處理 */
char buf1[50],buf2[50],*p1=buf1,*p2=buf2; /* 結(jié)果的整數(shù)部分和小數(shù)部分緩沖區(qū) */
/* p1是整數(shù)指針 p2是小數(shù)指針 */
double c=dbNumber;
c=c>0?c:-c;
/*取得大實數(shù)的整數(shù)部分和小數(shù)部分并非易事,long的長度直接限制了整數(shù)部分的長度,
除非構(gòu)造出更大的整數(shù)或直接利用實數(shù)計算,否則難以辦到!
此外受實數(shù)精度的影響,有時會導致小數(shù)部分的畸形!
精請高手指點!!!
*/
unsigned long a=(unsigned long)c; /*整數(shù)部分*/
double b=c-a; /*小數(shù)部分*/
/*printf("%lu\n",a);
printf("%lf\n",b);
printf("%lf\n",c);*/
/* 處理小數(shù)部分 */
for(int i=0;i<6;i++)
{
b*=10; /*將小數(shù)最高位向前進一位取得整數(shù)*/
int n=int(b);
ConvertN(n,p2); /*轉(zhuǎn)換成字符數(shù)值*/
b-=n; /*減去整數(shù)部分的數(shù)取得下一位小數(shù),將其成為整數(shù)*/
}
*p2='\0';
/* 處理整數(shù)部分 */
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;
}
/* 連接整數(shù)部分和小數(shù)部分 */
p1--;
while(p1>=buf1)
*p++=*p1--;
*p='\0';
strcat(lpszvalues,buf2);
return true;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -