unix c-金额类型转成英文大写

#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 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值