📄 mainformunit.pas
字号:
unit MainformUnit;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, ExtCtrls, ComCtrls,ShellApi;
type
TMainform = class(TForm)
PageControl1: TPageControl;
TabSheet1: TTabSheet;
TabSheet3: TTabSheet;
Label1: TLabel;
Edit1: TEdit;
CheckBox1: TCheckBox;
PageControl2: TPageControl;
TabSheet4: TTabSheet;
TabSheet5: TTabSheet;
Bevel1: TBevel;
Label2: TLabel;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
Label3: TLabel;
Memo1: TMemo;
Label4: TLabel;
Memo2: TMemo;
Label5: TLabel;
Memo3: TMemo;
Label6: TLabel;
Memo4: TMemo;
Label7: TLabel;
Memo5: TMemo;
Memo11: TMemo;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
TabSheet2: TTabSheet;
Memo6: TMemo;
function DecimalToChinese(number:Extended;cntype:integer):string;//数字转换汉字函数A
function DecimalToChineseExt(number:string;cntype:integer):string;//数字转换汉字函数B
function DecimalToEnglish(num:Extended;Cntype:integer):string;//数字转换英文函数A
function DecimalToEnglishExt(num:string;cntype:integer):string; //数字转换英文函数B
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure Label9Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Mainform: TMainform;
implementation
{$R *.DFM}
{***********************数字转换汉字函数A定义***********************}
function TMainForm.DecimalToChinese(number:Extended;cntype:integer):string;
{
介绍:参数number为Extended类型
cntype=0:转换为人民币大写格式
cntype=1:转化为数字大写格式
例如:DecimalToChinese(45092034.541,0) :'肆仟伍佰零玖万贰仟零叁拾肆元伍角肆分
DecimalToChinese(45092034.541,1) :'肆仟伍佰零玖万贰仟零叁拾肆点伍肆壹
注意:1.Number参数大小不超过999999999999999.0 (15位整数)
2.Number参数的位数(包括整数和小数全部位数,不包含小数点)
不要超过15位 因为程序中使用了Floattostr函数,其返回精度只有15位
如果Number小于1,精度有18位
否则返回的转换值有误差或者无法转换而提示错误
}
var
numstr:array[1..12] of string;//中文数位名
str1,str2,intstr,decstr:string;//整数部分,小数部分,大写整数部分,大写小数部分
num:array[1..10] of string;//各个数位段,即每四位为一段
n:array[1..10] of string;//各位数字
number1,number2,number3:string;//定义数字的三个数位段
decpos:integer;
NumHead:string;//正负性
NumberName:string;//用于代替参数Number的字符串
begin
if (Cntype<>0) and (CnType<>1) then begin
showmessage('类型参数错误');
result:='';
exit;
end;
{初始化}
numstr[1] :='零';
numstr[2] :='壹';
numstr[3] :='贰';
numstr[4] :='叁';
numstr[5] :='肆';
numstr[6] :='伍';
numstr[7] :='陆';
numstr[8] :='柒';
numstr[9] :='捌';
numstr[10]:='玖';
numstr[11]:='拾';
str1:='';
str2:='';
intstr:='';
decstr:='';
NumHead:='';
if Number<0 then begin //如果是负数,则在前面加‘负'
NumHead:='负';
Number:=-Number;
end;
//将数字转换为字符
try
if Number>1 then
NumberName:=Floattostr(Number)
else
NumberName:=formatfloat('0.000000000000000000',number);
if Cntype=0 then
NumberName:=formatfloat('0.00',number);//得到字符型数字格式,并四舍五入
except
on e:EConvertError do begin
Showmessage('非法浮点数') ;
result:='';
exit;
end;
end;
//分析出整数部分和小数部分
if Pos('.',NumberName)>0 then begin
str1:=copy(NumberName,1,Pos('.',NumberName)-1);//取整数部分
str2:=copy(NumberName,Pos('.',NumberName)+1,Length(NumberName)-Pos('.',NumberName));//取小数部分
end else begin
Str1:=NumberName;
Str2:=''
end;
//整理没有用的0字符
while Copy(Str1,1,1)='0' do Str1:=Copy(Str1,2,Length(Str1)-1);//去掉整数前面的0
if Str1='' then str1:='0';
while copy(str2,Length(Str2),1)='0' do Str2:=Copy(Str2,1,Length(str2)-1);//去掉小数部分的尾零
if (pos('e',str1+str2)>0) or (pos('E',str1+str2)>0) then begin
Showmessage('输入数字超出精度,不能转换!');
Result:='';
exit;
end;
{*****分析转换整数部分*****}
{分析整数部分在100000000以上的}
if length(str1)>8 then
begin
//按每4位为一段拆分成三段,逐段分析
num[1]:=copy(str1,1,length(str1)-8);//取8位以上的那部分数段
num[2]:=copy(str1,length(str1)-7,4);//取千万到万的4位
num[3]:=copy(str1,length(str1)-3,4);//取千到个位的4位
number1:=DecimalToChinese(strtofloat(num[1]),1)+'亿';//通过函数嵌套调用,得到亿上的数段格式,即若干亿
if strtoint(Num[2])=0 then//如果千万到万4位为0
begin
if strtoint(Num[3])=0 then//并且末尾4位为0
Number2:=''//没有内容
else
begin
if strtoint(Num[3])<1000 then
Number2:=''//如果第三段也是零XX百十个,则中间段的"零"去掉
else
Number2:=numstr[1];//读零
end;
end
else
begin
if strtoint(num[2])>1000 then //中间4位大于1000
Number2:=DecimalToChinese(strtoint(num[2]),1)+'万'
else
Number2:=numStr[1]+DecimalToChinese(strtoint(num[2]),1)+'万';//不足一千万,则读X亿零xx百、十、万
end;
if strtoint(Num[3])=0 then//末尾4位为0
Number3:=''
else
begin
if strtoint(num[3])>1000 then//末尾4位大于1000
Number3:=DecimalToChinese(strtoint(num[3]),1)
else
Number3:=numstr[1]+DecimalToChinese(strtoint(num[3]),1);//不足一千,则读X万零XX百、十
end;
intstr:=number1+number2+number3;
end;
{分析整数部分在10000~99999999之间的}
if (length(str1)>=5) and (length(str1)<=8) then
begin
//拆分为两段
num[1]:=copy(str1,1,length(str1)-4);//取得第一段(千万位到万位)
//为方便分析,若不足4位,用'0'补齐为4位
if length(num[1])=3 then
num[1]:='0'+num[1];
if length(num[1])=2 then
num[1]:='00'+num[1];
if length(num[1])=1 then
num[1]:='000'+num[1];
num[2]:=copy(str1,length(str1)-3,4);//取得第二段(千位到个位)
number1:=DecimalToChinese(strtoint(num[1]),1)+'万';
if strtoint(num[2])=0 then
number2:=''
else
begin
if strtoint(num[2])>1000 then //中间4位大于1000
Number2:=DecimalToChinese(strtoint(num[2]),1)
else
Number2:=numStr[1]+DecimalToChinese(strtoint(num[2]),1);//零若干百十
end;
intstr:=number1+number2;
end;
{分析整数部分不到10000的}
if length(str1)<5 then
begin
num[1]:=str1;
//不足4位,用'0'补齐
if length(num[1])=3 then
num[1]:='0'+num[1];
if length(num[1])=2 then
num[1]:='00'+num[1];
if length(num[1])=1 then
num[1]:='000'+num[1];
number1:='';//亿以上的为空
number2:='';//万以上的为空
//分析千位
if copy(num[1],1,1)='0' then
n[1]:='' //千位为0,千位字符空
else
n[1]:=numstr[strtoint(copy(num[1],1,1))+1]+'仟';
//分析百位
if copy(num[1],2,1)='0' then //百位为0,
begin
if copy(num[1],1,1)='0' then //且千位为0,
n[2]:='' //百位字符为空
else
n[2]:=numstr[1] //百位字符为‘零’
end
else
n[2]:=numstr[strtoint(copy(num[1],2,1))+1]+'佰';
//分析十位
if copy(num[1],3,1)='0' then
begin
if copy(num[1],2,1)='0' then
n[3]:=''
else
n[3]:=numstr[1]
end
else
begin
if (copy(num[1],1,1)='0') and (copy(num[1],2,1)='0') and (copy(num[1],3,1)='1') then//如果百位为0且十位为1则不读出壹字
n[3]:='拾'
else
n[3]:=numstr[strtoint(copy(num[1],3,1))+1] +'拾';
end;
//分析个位
if copy(num[1],4,1)='0' then
n[4]:=''
else
n[4]:=numstr[strtoint(copy(num[1],4,1))+1];
//
if copy(num[1],length(num[1])-2,3)='000' then//当末尾有000时
begin
n[2]:='';
n[3]:='';
n[4]:=''
end;
if copy(num[1],length(num[1])-1,2)='00' then//当末尾有00时
begin
n[3]:='';
n[4]:=''
end;
if copy(num[1],length(num[1]),1)='0' then//当末尾有0时
n[4]:='';
//数段合并
number3:=n[1]+n[2]+n[3]+n[4];
//取得整数位值
intstr:=number1+number2+number3;
end;
{如果整数为零,转换为"零"}
if str1='0' then
intstr:=numstr[1];
{整数转换完毕}
{*****分析和转换小数部分*****}
if length(str2)>0 then //如果小数数段不为空,则分析小数
begin
if cntype=0 then{一.如果转换为人民币表达式}
begin
//不足2位,用零补足空位
if length(str2)=1 then str2:=str2+'0';
if copy(str2,1,1)='0' then//角为0
begin
if Intstr='零' then n[1]:='' else n[1]:='零';//如果元为0,则不读0角,否则读零若干分
end
else
n[1]:=numstr[strtoint(copy(str2,1,1))+1]+'角';
if copy(str2,2,1)='0' then
n[2]:=''
else
n[2]:=numstr[strtoint(copy(str2,2,1))+1]+'分';
decstr:=n[1]+n[2];
end
else //二.如果转换为数字表达式
begin
decstr:='';
for decpos:=1 to length(str2) do
begin
decstr:=decstr+numstr[strtoint(copy(str2,decpos,1))+1];
end;
end;
end;
{小数转换完毕}
{输出本函数的结果***********************}
if cntype=0 then//将数字字串转换为人民币的大写格式
begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -