299上位机VC MFC使用ADO使数字转为大写中文
ADO使数字转为大写中文
功能展示
ADO数据库程序中,有时需要将啊拉伯数字转换为大写的中文,这种需求在账务方面项目可能会比较多,如7转为柒,我们当前例程就实现这一功能,效果如图 ,程序运行会初始化连接根目录数据库文件,并显示第一条数据及对应大写中文,点击<上一条><下一条>可以浏览数据库表Number字段的上一条或下一条数据的啊拉伯数字及对应大写中文数字;
要点提示
将数据库中啊拉伯数字形式数据转化为中文大写数字,我们可以利用堆栈操作的特殊进栈,出栈方式,在实现时根据数字的位置和大小,将啊拉伯数字逐个转换为中主大写的数字;
实现功能
1.新建基于对话框的应用程序
2.在stdafx.h中加入ADO支持库
#import “c:\program files\common files\system\ado\msado15.dll” no_namespace rename (“EOF”, “adoEOF”) 及#include "icrsint.h"//IADORecordBinding 头文件
3.主对话框中添加变量public:
private:_ConnectionPtr m_pConn;_RecordsetPtr m_pRst;; 并初始化
::CoInitialize(NULL);
_variant_t vFieldValue;
CString strFieldValue;
m_pConn.CreateInstance(__uuidof(Connection));
try
{
m_pConn->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=number.mdb","","",adModeUnknown);
}
catch(_com_error e)
{
AfxMessageBox("数据库连接失败!");
}
try
{
DWORD dwData = S_OK;
dwData = m_pRst.CreateInstance(__uuidof(Recordset));
dwData = m_pRst->Open("select * from Table_Num",m_pConn.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
}
catch(_com_error e)
{
CString str;
str = e.ErrorMessage();
}
if(VARIANT_FALSE==m_pRst->EndOfFile)
{
long Num;
vFieldValue=m_pRst->GetCollect("Number");
strFieldValue=(char*)_bstr_t(vFieldValue);
SetDlgItemText(IDC_NUM,strFieldValue);
Num=atol(strFieldValue.GetBuffer(0));
longtostr(Num);
SetDlgItemText(IDC_CAPITALNUM,strNum);
}
5.在主对话框源文件顶部添加我们转换的一些全局变量及函数
//<>
int sp=-1;
CString strNum="";
#define OK 0
#define OVER 1
#define EMPTY 2
#define UNKNOWN 3
#define STACKSIZE 1024
typedef struct myvalue
{
int value;
int type;
}MYVALUE;
MYVALUE stack[STACKSIZE];
char *un1[]={"","拾","佰","仟"};
char *un2[]={"","万","亿"};
char *rank[]={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
//<>
int drop()
{
if(sp<0)
return EMPTY;
sp--;
return OK;
}
int pop(int *value,int *type)
{
if(sp<0)
return EMPTY;
*value=stack[sp].value;
*type=stack[sp].type;
sp--;
return OK;
}
int pickup(int *value,int *type)
{
if(sp<0)
return EMPTY;
*value=stack[sp].value;
*type=stack[sp].type;
return OK;
}
int push(int value,int type)
{
int vv;
int tt;
int ret;
if(value==0&&type==0)
{
ret=pickup(&vv,&tt);
if((vv==0)||ret||tt>1)
return UNKNOWN;
}
if(type==2)
{
ret=pickup(&vv,&tt);
if(tt==2&&vv<value)
drop();
}
if(++sp>=STACKSIZE)
return OVER;
stack[sp].value=value;
stack[sp].type=type;
return OK;
}
int cleanstack()
{
for(int i=sp;i>=0;i--)
{
stack.type=0;
stack.value=0;
}
strNum="";
sp=-1;
return OK;
}
int dump()
{
int i1;
int vv,tt;
CString str;
for(i1=sp;i1>=0;i1--)
{
vv=stack[i1].value;
tt=stack[i1].type;
if(i1==sp&&(tt>0||(tt==0&&vv==0)))
continue;
switch(tt)
{
case 0:
str.Format("%s",rank[vv]);
break;
case 1:
str.Format("%s",un1[vv]);
break;
case 2:
str.Format("%s",un2[vv]);
break;
}
strNum+=str;
}
return OK;
}
void str2str(char *s)
{
cleanstack();
char *hh,*tt;
int dd,cc;
int utype1,utype2,dtype;
int slen;
if(!s)
{
printf("零\n");
return;
}
slen=strlen(s);
hh=s;
tt=s+slen-1;
dd=utype1=utype2=dtype=0;
for(;tt>=hh;tt--)
{
cc=(*tt)-'0';
if(utype2>0&&utype1==0)
push(utype2,2);
if(cc)
push(utype1,1);
push(cc,0);
dd++;
utype1=dd%4;
utype2=(dd/4)%3;
if(dd>8&&utype2==0)
utype2++;
}
dump();
return;
}
void longtostr(long n)
{
char str[12];
sprintf(str,"%ld",n);
str2str(str);
}
最后再依照例程界面添加两编辑框,及两按钮,实现数据库文件的遍历,具体看视频演示
我偿来实现下具体的实现过程
如果您认可,可联系功能定制! 如果您着急,充值会员可直接联系发您资料!
|