大小写转换

来源:互联网 发布:矩阵型组织结构的特点 编辑:程序博客网 时间:2024/04/29 22:37

#include <stdio.h>
#include <math.h>
const char mnUnit[3]={"点\0"};
const char OtherWords[2][3]={"整\0","负\0"};
const char hzUnit[8][3]={"拾\0","佰\0","仟\0","万\0","拾\0","佰\0","仟\0","亿\0"};
const char hzNum[10][3]={"零\0","壹\0","贰\0","叁\0","肆\0","伍\0","陆\0","柒\0","捌\0","玖\0"};
extern "C" __declspec(dllexport)
       double __stdcall Round(const double Value,
                              const short int ADigit=0,
                              const short int RoundMark=0
                             )
{    char LocalRoundMark=RoundMark;
   double Result=Value;
   double DResult;
   if(ADigit>18)
      return Result;
   double DigitValue=powl(10,ADigit);

   if(LocalRoundMark>0)LocalRoundMark=1;
   if(LocalRoundMark<0)LocalRoundMark=-1;

   switch(LocalRoundMark)
   {
      case -1://Round Down
           Result*=DigitValue;
           if(Value<0.00)//负数
              Result=ceill(Result);
           else
              Result=floorl(Result);
           break;
      case  1://Round Up
           Result*=DigitValue;
           if(Value<0.00)//负数
              Result=floorl(Result);
           else
              Result=ceill(Result);
           break;
      default://Round  四舍五入
           if(Value<0.00)//负数
              Result-=0.5/DigitValue;
           else
              Result+=0.5/DigitValue;
           Result*=DigitValue;
           DResult=Result;
           if(Value<0.00)
           {
              Result=ceill(Result);
              DResult=Result-DResult;
              if(DResult>0.99999995/*0.9999999999*/)Result-=1.0;
           }
           else
           {
              Result=floorl(Result);
              DResult=DResult-Result;
              if(DResult>0.99999995/*0.9999999999*/)Result+=1.0;
           }
   }
   Result/=DigitValue;
   return Result;
}

extern "C" __declspec(dllexport)
       unsigned char __stdcall Money2ChineseCapital(const double Num,
                                                    const unsigned char BufferLength,
                                                    char *Buffer,
                                                    const short int ADigit=2,
                                                    const short int RoundMark=0
                                                   )
{    char szChMoney[33*4+1],*szNum;
   int iLen,iLen2, iNum, iAddZero=0;
   char buff[33];
   char *buf=buff;
   sprintf( buf,"%0.0f",Round(Num,ADigit,RoundMark)*100.0);
   iLen=strlen(buf);
   szNum=szChMoney;
   if(Num<0.0)
   {
      *(szNum++)=OtherWords[1][0];
      *(szNum++)=OtherWords[1][1];
      buf++;
      iLen--;
   }
   if(iLen<3)
   {
      *(szNum++)=hzNum[0][0];
      *(szNum++)=hzNum[0][1];
      *(szNum++)=mnUnit[0];
      *(szNum++)=mnUnit[1];
   }
   if(iLen<2)
   {
      *(szNum++)=hzNum[0][0];
      *(szNum++)=hzNum[0][1];
   }
   for(int i=1;i<=iLen;i++)
   {
      iNum=buf[i-1]-48;
      iLen2=iLen-i;
      if(iNum==0)
      {
         if((iLen2-2)%4==0&&(iLen2-3)>0&&((iLen2>=8)||iAddZero<3))
         {
            *(szNum++)=hzUnit[(iLen2-3)%8][0];
            *(szNum++)=hzUnit[(iLen2-3)%8][1];
         }
         iAddZero++;

      }
      else
      {
         if(iLen>1&&iLen2==0&&iAddZero>0)
         {
            *(szNum++)=hzNum[0][0];
            *(szNum++)=hzNum[0][1];
         }
         if((iAddZero&&iLen2>=2)&&((iLen2-1)%4!=0)||(iAddZero>=4&&(iLen2-1)>0))
         {
            *(szNum++)=hzNum[0][0];
            *(szNum++)=hzNum[0][1];
         }
         *(szNum++)=hzNum[iNum][0];
         *(szNum++)=hzNum[iNum][1];
         iAddZero=0;
      }
      if((iAddZero<1)||(iLen2==2))
      {
         if(iLen-i>=3)
         {
            *(szNum++)=hzUnit[(iLen2-3)%8][0];
            *(szNum++)=hzUnit[(iLen2-3)%8][1];
         }
         else
         {
            if(iLen2%3==2)
            {
               *(szNum++)=mnUnit[0];
               *(szNum++)=mnUnit[1];
            }
         }
      }
   }
   int Result=szNum-szChMoney;
   if(Result+(Num<0.0?(-2):0)==0)
   {
      *(szNum++)=hzNum[0][0];
      *(szNum++)=hzNum[0][1];
      Result+=2;
   }
   if(BufferLength)
   {
      if(BufferLength>0)
         Result=(Result>BufferLength)?BufferLength:Result;
      memcpy(Buffer,szChMoney,Result);
   }
   return Result;
} ================================
看看可以不?不过只支持小数点后两位,当然也不可能支持任意位.
调用方法:
   double dValue=1000.05;
   char ch1[14*4+1];
   int Count=1;
   TDateTime dt2=Now();
   for(int i=0;i<Count;i++)
   {
      Byte bLen=Money2ChineseCapital(dValue,14*4,ch1);
      ch1[bLen]='\0';
   }
   dt2=Now()-dt2;
   ShowMessage(Format("Money2ChineseCapital(%0.3f,14*4,ch)\r\n[最后转换结果]:%s\r\n[转换%d次,耗时]:%0.6f秒",
                      ARRAYOFCONST((dValue,ch1,Count,dt2.Val*24.0*60.0*60.0))));