#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
/* 翻译1-20,30,40,50,60,70,80,90 */
void convert1(int n,char english[])
{
switch(n)
{
case 0:strcpy(english," ");break;
case 1:strcpy(english,"ONE");break;
case 2:strcpy(english,"TWO");break;
case 3:strcpy(english,"THREE");break;
case 4:strcpy(english,"FOUR");break;
case 5:strcpy(english,"FIVE");break;
case 6:strcpy(english,"SIX");break;
case 7:strcpy(english,"SEVEN");break;
case 8:strcpy(english,"EIGHT");break;
case 9:strcpy(english,"NINE");break;
case 10:strcpy(english,"TEN");break;
case 11:strcpy(english,"ELEVEN");break;
case 12:strcpy(english,"TWELVE");break;
case 13:strcpy(english,"THIRTEEN");break;
case 14:strcpy(english,"FOURTEEN");break;
case 15:strcpy(english,"FIFTEEN");break;
case 16:strcpy(english,"SIXTEEN");break;
case 17:strcpy(english,"SEVENTEEN");break;
case 18:strcpy(english,"EIGHTEEN");break;
case 19:strcpy(english,"NINETEEN");break;
case 20:strcpy(english,"TWENTY");break;
case 30:strcpy(english,"THIRTY");break;
case 40:strcpy(english,"FORTY");break;
case 50:strcpy(english,"FIFTY");break;
case 60:strcpy(english,"SIXTY");break;
case 70:strcpy(english,"SEVENTY");break;
case 80:strcpy(english,"EIGHTY");break;
case 90:strcpy(english,"NINETY");break;
default:strcpy(english,"");
}
}
/* 翻译所有的两位数 */
void convert2(int n,char english[])
{
int t1,t2;
char a[100];
if(n<=20)
{
convert1(n,english);
return;
}
t1=n%10;t2=n-t1;
if(t2>0)
{
convert1(t2,english);
if(t1>0)
{
convert1(t1,a);
strcat(english," ");
strcat(english,a);
}
}
else
convert1(t1,english);
}
/* 翻译所有的三位数 */
void convert3(int n,char english[])
{
printf("进入conver3函数 n=%d\n",n);
int t2,t3;
char a[100];
t2 = n%100;
t3 = n/100;
if(t3>0)
{
convert2(t3,english);
strcat(english," HUNDRED");
if(t2>0)
{
convert2(t2,a);
strcat(english," AND ");
strcat(english,a);
}
}
else
convert2(t2,english);
}
char *convert(double amt , char *curr , char curr_Str[])
{
printf("%15.2f\n",amt);
if( amt < 0.01)
{
return "ZERO";
}
char buff[16];
char strIntNum[16+1];
char strDecNum[2+1];
char tmp_strIntNum[16+1];
char tmp_strDecNum[2+1];
char tmp_str[3+1];
char *amtArray[2];
char english[10240+1];
char outStr[10240+1];
char tmp_outStr[10240+1];
char dec_outStr[10240+1];
char join_outStr[10240+1];
char *Dictionary[5] = {" ","THOUSAND ","MILLION ","BILLION ","TRILLION "};
long long strIntNumLen;
long long strDecNumLen;
int looptimes;
int i;
memset( buff , 0x00 , sizeof(buff) );
memset(amtArray,0x00,sizeof(amtArray));
memset(strIntNum,0x00,sizeof(strIntNum));
memset(strDecNum,0x00,sizeof(strDecNum));
memset(tmp_strIntNum,0x00,sizeof(tmp_strIntNum));
memset(tmp_strDecNum,0x00,sizeof(tmp_strDecNum));
memset(tmp_str,0x00,sizeof(tmp_str));
memset(outStr,0x00,sizeof(outStr));
memset(tmp_outStr,0x00,sizeof(tmp_outStr));
memset(dec_outStr,0x00,sizeof(dec_outStr));
memset(curr_Str,0x00,sizeof(curr_Str));
memset(join_outStr,0x00,sizeof(join_outStr));
if( amt < 0.01)
{
sprintf( curr_Str , " ZERO " );
return curr_Str;
}
sprintf( buff , "%15.2f" , amt );
trim(buff);
printf("buff=%s\n",buff);
split(amtArray,buff,".");
sprintf(strIntNum,"%s",amtArray[0]);
sprintf(strDecNum,"%s",amtArray[1]);
printf("strIntNum=%s\n",strIntNum);
printf("strDecNum=%s\n",strDecNum);
strIntNumLen = strlen(strIntNum);
strDecNumLen = strlen(strDecNum);
printf("strIntNumLen=%d\n",strIntNumLen);
printf("strDecNumLen=%d\n",strDecNumLen);
/*********** 整数部分开始 *************/
/****** 格式化整数部分-前补零 ********/
if( strIntNumLen < 3)
{
sprintf( tmp_strIntNum , "%03d" , atoi(strIntNum) );
}
else if( strIntNumLen < 6 && strIntNumLen >3 )
{
sprintf( tmp_strIntNum , "%06d" , atoi(strIntNum) );
}
else if( strIntNumLen < 9 && strIntNumLen >6 )
{
if( strIntNumLen == 7)
{
sprintf(tmp_strIntNum , "00%s" , strIntNum);
}
else
{
sprintf(tmp_strIntNum , "0%s" , strIntNum );
}
/* sprintf( tmp_strIntNum , "%09d" , atoll(strIntNum) ); */
}
else if( strIntNumLen < 12 && strIntNumLen >9 )
{
if( strIntNumLen == 10)
{
sprintf(tmp_strIntNum , "00%s" , strIntNum);
}
else
{
sprintf(tmp_strIntNum , "0%s" , strIntNum );
}
/* sprintf( tmp_strIntNum , "%012d" , atoll(strIntNum) ); */
}
else if( strIntNumLen < 15 && strIntNumLen >12 )
{
if( strIntNumLen == 13)
{
sprintf(tmp_strIntNum , "00%s" , strIntNum);
}
else
{
sprintf(tmp_strIntNum , "0%s" , strIntNum );
}
/* sprintf( tmp_strIntNum , "%015d" , atoll(strIntNum) ); */
}
else if( strIntNumLen < 18 && strIntNumLen >15 )
{
if( strIntNumLen == 16)
{
sprintf(tmp_strIntNum , "00%s" , strIntNum);
}
else
{
sprintf(tmp_strIntNum , "0%s" , strIntNum );
}
/* sprintf( tmp_strIntNum , "%018d" , atoll(strIntNum) ); */
}
else
{
sprintf( tmp_strIntNum , "%s" , strIntNum );
}
/* 计算循环次数 */
printf("tmp_strIntNum=%s\n",tmp_strIntNum);
if( strIntNumLen < 3 )
{
looptimes = 1;
}
else
{
looptimes = ceil((double)strIntNumLen / 3);
}
printf("looptimes=%d\n",looptimes);
/* 开始循环 */
for( i= 0 ; i < looptimes ; i++ )
{
/* 补零之后整数部分是3的倍数,从左边开始取,每次取3位数字出来*/
strncpy( tmp_str , tmp_strIntNum + 3*i , 3 );
convert3( atoi(tmp_str) , english );
if( strcmp(english," ") == 0 )
{
i++;
}
else
{
sprintf( tmp_outStr , "%s %s",english , Dictionary[looptimes - i - 1 ] );
strcat(outStr,tmp_outStr);
}
}
printf( "outStr = %s\n",outStr );
/******* 整数部分结束 ************/
/*******小数部分开始 **********/
convert2( atoi(strDecNum) , english );
if( strcmp( english , " " ) == 0 )
{
sprintf( dec_outStr , "ONLY. " );
}
else
{
sprintf( dec_outStr , "CENTS %s " , english );
}
printf( "dec_outStr=%s\n" , dec_outStr );
sprintf( join_outStr , "%s %s " , outStr , dec_outStr );
printf( "join_outStr=%s\n" , join_outStr );
/************ 小数部分结束 ************/
/******** 拼接 语种 整数 小数 *********/
if( strcmp( curr , "USD" ) == 0 )
{
sprintf( curr_Str , "SAY U.S. DOLLARS %s" , join_outStr );
}
else if( strcmp( curr , "CNY" ) == 0 )
{
sprintf( curr_Str , "SAY China Yuan %s" , join_outStr );
}
else if( strcmp( curr , "THB" ) == 0 )
{
sprintf( curr_Str , "SAY Titanium Healthy Beauty %s" , join_outStr );
}
else if( strcmp( curr , "LAK" ) == 0 )
{
sprintf( curr_Str , "SAY Lao Kip %s" , join_outStr );
}
printf("curr_Str=%s\n",curr_Str );
/********* 拼接结束 ************/
return curr_Str;
}
void ltrim(char *s)
{
char *p;
p = s;
while(*p == ' ' || *p == '\t'){*p++;}
strcpy(s,p);
}
void rtrim(char *s)
{
int i;
i = strlen(s)-1;
while((s[i] == ' ' || s[i] == '\t') && i >= 0){i--;};
s[i+1] = '\0';
}
void trim(char *s)
{
ltrim(s);
rtrim(s);
}
void split( char **arr, char *str, const char *del)
{
char *s =NULL;
s=strtok(str,del);
while(s != NULL)
{
*arr++ = s;
s = strtok(NULL,del);
}
}
void main()
{
char english[2048];
char *curr = "THB";
double amt = 50505005050.05;
char *str = "";
str = convert(amt ,curr, english);
printf("%s\n",str);
}
/* 以下是运行结果 */
SAY Titanium Healthy Beauty FIFTY BILLION FIVE HUNDRED AND FIVE MILLION FIVE THOUSAND FIFTY CENTS FIVE