当前位置: 开源爱好者 » 编程教程 » VC++教程 » 正文

VC++ 阿拉伯数字转中文大写

VC++ 阿拉伯数字转中文大写,介绍如何处理中文大写数字,编译并运行本例程序,如下图所示。上面显示的是阿拉伯数字,下面显示的是对应的中文大写数字。单击【下一条】按钮,显示数据库的下一条记录,单击【上一条】按钮,显示数据库的上一条记录。

实现方法:在数据库中保存为阿拉伯数字的形式,然后在显示时根据数字的位置和大小,将阿拉伯数字逐个转换为中文大写的数字。程序代码的编写如下:
(1)创建名为CapitalNum 的Access 数据库,包含一个表table1,只有数字类型的字段Num,字段大小为长整形。增加几条记录,随便输入长整形数字。
(2)注册该数据库,数据源名为capitalnum。
(3)通过AppWizard 生成基于对话框的应用程序CapitalNum。
(4)在对话框的CPP 文件开头处定义4 个表示操作堆栈结果的常数,其代码如下:

//定义操作堆栈结果的常数
#define OK 0 //操作成功
#define EOVER 1 //超过堆栈最大值
#define EEMPTY 2 //堆栈为空
#define EUNKNOWN 3 //未知的操作

(5)在对话框的CPP 文件开头处定义堆栈的大小,其代码如下:

//堆栈的大小
#define STACKSIZE 1024

(6)在对话框的CPP 文件开头处定义3 组保存有大写阿拉伯数字的字符串数组,其代码如下:

char *unit1[] = {"", "拾","佰","仟"};
char *unit2[] = {"","万","亿"};
char *digital[] = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};

(7)在对话框的CPP 文件开头处定义堆栈的数据结构定义,其代码如下:

//堆栈数据结构
typedef struct meta {
int value;
int type;
} META;

(8)在对话框的CPP 文件开头处定义堆栈,其代码如下:

//堆栈
META stack[STACKSIZE];

(9)在对话框的CPP 文件开头处定义堆栈当前索引,其代码如下:

//堆栈索引
int sp = -1;

(10)在对话框的CPP 文件开头处定义保存转换后的结果字符串,其代码如下:

//转换后的结果字符串
CString strNum = "";

(11)在对话框的CPP 文件开头处声明和定义进堆栈的函数Push,其代码如下:

int push (int value, int type); //进堆栈
//进堆栈
int push (int value, int type)
{
int v;
int t;
int ret;
if (value == 0 && type ==0) {
ret = pickup (&v, &t);
if ( (v ==0) || ret || t>1)
return EUNKNOWN;
}
if (type == 2) {
ret = pickup (&v, &t);
if (t == 2 && v < value)
drop ();
}
if (++sp >= STACKSIZE)
return EOVER;
stack[sp].value = value;
stack[sp].type = type;
return OK;
}

(12)在对话框的CPP 文件开头处声明和定义出堆栈的函数Pop,其代码如下:

int pop (int *value, int *type); //出堆栈
//出堆栈
int pop (int *value, int *type)
{
if (sp < 0)
return EEMPTY;
*value = stack[sp].value;
*type = stack[sp].type;
sp --;
return OK;
}

(13)在对话框的CPP 文件开头处声明和定义函数Drop,其代码如下:

int drop ();
int drop ()
{
if (sp < 0)
return EEMPTY;
sp --;
return OK;
}

(14)在对话框的CPP 文件开头处声明和定义取堆栈头数据的函数Pickup,其代码如下:

int pickup(int *value, int *type); //取堆栈头的数据
//获得堆栈头的数据
int pickup(int *value, int *type)
{
if (sp < 0)
return EEMPTY;
*value = stack[sp].value;
*type = stack[sp].type;
return OK;
}

(15)在对话框的CPP 文件开头处声明和定义清空堆栈的函数Cleanstack,其代码如下:

int cleanstack (); //清空堆栈
//清空堆栈
int cleanstack ()
{
for (int i = sp; i>=0; i--)
{
stack[i].type = 0;
stack[i].value = 0;
}
strNum = "";
sp = -1;
return OK;
}

(16)在对话框的CPP 文件开头处声明和定义将堆栈的数据写入字符串的函数Dump,其代码如下:

int dump(); //将堆栈的数据写入字符串
//将堆栈的数据写入字符串
int dump ()
{
int i;
int v,t;
CString str;
for (i = sp; i>=0; i--) {
v = stack[i].value;
t = stack[i].type;
if (i==sp && (t >0 || (t ==0 && v ==0)))
continue;
switch (t)
{
case 0://1,2,3,4,5,6,7,8,9
str.Format("%s",digital[v]);
break;
case 1://十,佰,千
str.Format("%s",unit1[v]);
break;
case 2://万,亿
str.Format("%s",unit2[v]);
break;
}
strNum += str;
}
return OK;
}

(17)在对话框的CPP 文件开头处声明和定义转换数字的函数Str2str 和Longtostr,其代码如下:

void str2str (char *s); //转换
void longtostr (long n);
//将数字字符串转换为中文大写字符串
void str2str (char *s)
{
//清空堆栈
cleanstack();
char *h, *t;
int d, c;
int utype1, utype2, dtype;
int slen;
//如果为空,则设为零
if (!s) {
printf ("零\n");
return;
}
//获得数字字符串长度
slen = strlen (s);
h = s;
t = s+slen-1;
//初始化表示数字位置的类型
d = utype1 = utype2 = dtype = 0;
//逐个数字转换
for (;t>=h;t--) {
c = (*t) - ’0’;
if (utype2>0 && utype1 ==0)
push (utype2, 2);
if (c)
push (utype1, 1);
push (c, 0);
d++;
utype1 = d % 4;
utype2 = (d / 4) % 3;
if (d > 8 && utype2 ==0)
utype2++;
}
//将堆栈的值转换为一个字符串
dump();
return;
}
//将长整形值转换为中文大写数字
void longtostr (long n)
{
char s[12];
sprintf (s, "%ld", n);
str2str (s);
return;
}

(18)由于本例用ADO 访问数据库,所以在stdafx.h 函数中增加如下代码:

#import "c:\Program Files\Common Files\System\ADO\msado15.dll" no_namespace rename("EOF", "EndOfFile")
rename("BOF","FirstOfFile")
#include "ICRSINT.H"

(19)给对话框增加用于访问数据库的两个私有成员变量,其代码如下:

_ConnectionPtr m_pCon; //连接对象
_RecordsetPtr m_pRs; //记录集对象

未完,这里进入下一部分>>VC++ 数据库中读取数字转换成中文大写

CopyRight 2018© 开源爱好者 All Rights Reserved 豫ICP备16030607号 隐私声明 网站地图