帮测试函数代码,BUG反馈请留言.
#define BUFFER_SIZE 256
#define ENDOFSTR '\0'
int WCStrToStr( wchar_t* wc, char* lpszBuff, int iBuffSize )
{
return WideCharToMultiByte( CP_ACP, WC_COMPOSITECHECK, wc, -1, lpszBuff, iBuffSize, NULL, NULL );
}
char* NumberToChineseStr( int iData, char* lpszBuff, int iBuffSize )
{
//////////////////////////////////////////////////////////
const
wchar_t NUM[] = L"零壹贰叁肆伍陆柒捌玖";
wchar_t UNIT[] = L"仟佰拾万亿";
//12 3456 7890
//亿 万 个
//十,个 千,百,十,个 千,百,十,个
//2, 3 0, 1, 2, 3 0, 1, 2, 3
//section1 section2 section3
wchar_t SIGN[] = L"负正";
//////////////////////////////////////////////////////////
wchar_t wsRet[BUFFER_SIZE];
int iTmpData, i = 0, iPos = 0;
div_t rslt;
BOOL bHasValue = FALSE, bPreIsZero = TRUE;
int iIdx1, iIdx2;
/*iCount == 4时表示刚解析完的SECTION为四个0:0000,这时不需要加数量级单位,因为"亿"只有个,十两位,
所以iCount初始化为2,即千亿位和百亿位都为0.*/
int iCount = 2;
ZeroMemory( wsRet, BUFFER_SIZE * sizeof( wchar_t ) );
iTmpData = iData;
//是负数则在最前面加"负"
if( iTmpData < 0 )
{
wsRet[ iPos ] = SIGN[ iPos ];
iTmpData = abs( iTmpData );//由负数转换为正数
iPos++;
}
while( i < 10 )//循环扫描
{
rslt = div( iTmpData, int( pow( 10 , (9 - i) ) ) );
//忽略无用的"零"
if( ( rslt.quot != 0 ) || ( bHasValue == TRUE ) )
{
bHasValue = TRUE;//有数值后不再忽略"零"
iIdx1 = ( 4 - ( (10 - i) % 4 ) ) % 4;//计算每四位对应的索引:千,百,十,个
//0, 1, 2, 3
if( rslt.quot != 0 )//商不等于"零"
{
bPreIsZero = FALSE;//前面一位不为零标记
wsRet[ iPos ] = NUM[ rslt.quot ];//在返回字符串中写入中文"数字"
iPos++;
iTmpData = rslt.rem;//余数作为被除数
if( iIdx1 != 3 ) //0, 1, 2, 3
{
//如果不是每四位中的"个位"则加"千,百,十"
wsRet[ iPos ] = UNIT [ iIdx1 ];
iPos++;
}
}
else//商等于"零"
{
if( bPreIsZero != TRUE)
{
bPreIsZero = TRUE;
wsRet[ iPos ] = NUM[ rslt.quot ];
iPos++;
iTmpData = rslt.rem;
}
}
}
if( rslt.quot == 0 )//统计每个SECTION"零"的个数.
{
if( iIdx1 == 0 ) iCount = 0;//每个SECTION的开始将iCount清零
iCount++;//统计每个SECTION零的个数,如果一个SECTION的四位都为零,则不加数量级单位。
}
//每四位加一量级单位"亿"或"万"
// 第一个SECTION判断 最后一个SECTION判断
// 若有值则要加数量级单位 若是最后一个SECTION则不加数量级单位"个"
if( ( ( 9 - i ) % 4 ) == 0 && ( bHasValue == TRUE ) && ( i != 9 ) && ( iCount != 4 ))
//中间的其它SECTION判断
{
if( bPreIsZero == TRUE )//去掉每个SECTION的最后一个"零"
{
iPos--;
bPreIsZero = FALSE;
}
iIdx2 = 2 + ( 9 - i ) / 4 ;
wsRet[ iPos ] = UNIT[ iIdx2 ];
iPos++;
}
i++;
}
iPos--;
if( wsRet[ iPos ] == NUM[0] ) wsRet[ iPos ] = ENDOFSTR;//若最后一个为"零",则去掉它
WCStrToStr( wsRet, lpszBuff, iBuffSize );
return lpszBuff;
}