帮测试函数代码,BUG反馈请留言.

bondliu200 2003-04-03 01:52:05
#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;
}
...全文
43 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
bondliu200 2003-04-04
  • 打赏
  • 举报
回复
up
bondliu200 2003-04-03
  • 打赏
  • 举报
回复
up

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧