#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))));