?? 小寫數字轉換成大寫數字2.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 + -