现在的位置: 首页 > 综合 > 正文

人民币读数(转中文大写,C/C++)

2013年12月04日 ⁄ 综合 ⁄ 共 2568字 ⁄ 字号 评论关闭
  1. //早年写的代码,功能很简单,以效率为主要目的
  2. #include <stdio.h> 
  3. #include <math.h> 
  4. const char mnUnit[3][2]={"分","角","元"}; 
  5. const char OtherWords[2][2]={"整","负"}; 
  6. const char hzUnit[8][2]={"拾","佰","仟","万","拾","佰","仟","亿"}; 
  7. const char hzNum[10][2]={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"}; 
  8. extern "C" __declspec(dllexport
  9.        unsigned char __stdcall Money2ChineseCapital2(const double Num, 
  10.                                                      const unsigned char BufferLength, 
  11.                                                      char *Buffer 
  12.                                                     ) 
  13.    char szChMoney[33*4+1],*szNum; 
  14.    int iLen,iLen2, iNum, iAddZero=0; 
  15.    char buff[33]; 
  16.    char *buf=buff; 
  17.    sprintf( buf,"%0.0f",(double)(__int64)(Num*100.0+0.5*(Num<0.0?(-1):1))); 
  18.    iLen=strlen(buf); 
  19.    szNum=szChMoney; 
  20.    if(Num<0.0) 
  21.    { 
  22.       *(szNum++)=OtherWords[1][0]; 
  23.       *(szNum++)=OtherWords[1][1]; 
  24.       buf++; 
  25.       iLen--; 
  26.    } 
  27.    for(int i=1;i<=iLen;i++) 
  28.    { 
  29.       iNum=buf[i-1]-48; 
  30.       iLen2=iLen-i; 
  31.       if(iNum==0) 
  32.       { 
  33.          if((iLen2-2)%4==0&&(iLen2-3)>0&&((iLen2>=8)||iAddZero<3)) 
  34.          { 
  35.             *(szNum++)=hzUnit[(iLen2-3)%8][0]; 
  36.             *(szNum++)=hzUnit[(iLen2-3)%8][1]; 
  37.          } 
  38.          iAddZero++; 
  39.          if(iLen>1&&iLen2==1) 
  40.          { 
  41.             *(szNum++)=hzNum[0][0]; 
  42.             *(szNum++)=hzNum[0][1]; 
  43.          } 
  44.       } 
  45.       else 
  46.       { 
  47.          if((iAddZero&&iLen2>=2)&&((iLen2-1)%4!=0)||(iAddZero>=4&&(iLen2-1)>0)) 
  48.          { 
  49.             *(szNum++)=hzNum[0][0]; 
  50.             *(szNum++)=hzNum[0][1]; 
  51.          } 
  52.          *(szNum++)=hzNum[iNum][0]; 
  53.          *(szNum++)=hzNum[iNum][1]; 
  54.          iAddZero=0; 
  55.       } 
  56.       if((iAddZero<1)||(iLen2==2)) 
  57.       { 
  58.          if(iLen-i>=3) 
  59.          { 
  60.             *(szNum++)=hzUnit[(iLen2-3)%8][0]; 
  61.             *(szNum++)=hzUnit[(iLen2-3)%8][1]; 
  62.          } 
  63.          else 
  64.          { 
  65.             *(szNum++)=mnUnit[(iLen2)%3][0]; 
  66.             *(szNum++)=mnUnit[(iLen2)%3][1]; 
  67.          } 
  68.       } 
  69.    }
  70.    int Result=szNum-szChMoney; 
  71.    if(Result+(Num<0.0?(-2):0)==0) 
  72.    { 
  73.       *(szNum++)=hzNum[0][0]; 
  74.       *(szNum++)=hzNum[0][1]; 
  75.       *(szNum++)=mnUnit[2][0]; 
  76.       *(szNum++)=mnUnit[2][1]; 
  77.       *(szNum++)=OtherWords[0][0]; 
  78.       *szNum=OtherWords[0][1]; 
  79.       Result+=6; 
  80.    } 
  81.    else 
  82.    if(buf[iLen+(Num<0.0?1:0)-1]=='0'
  83.    { 
  84.       *(szNum++)=OtherWords[0][0]; 
  85.       *szNum=OtherWords[0][1]; 
  86.       Result+=2; 
  87.    } 
  88.    if(BufferLength) 
  89.    { 
  90.       if(BufferLength>0) 
  91.          Result=(Result>BufferLength)?BufferLength:Result; 
  92.       memcpy(Buffer,szChMoney,Result); 
  93.    } 
  94.    return Result; 
  95. }

抱歉!评论已关闭.