一个比较奇怪的现象. ( 积分: 100 )

  • 主题发起人 主题发起人 sungods
  • 开始时间 开始时间
S

sungods

Unregistered / Unconfirmed
GUEST, unregistred user!
写了一个可以针对序号自增的函数.但是输入是9,99,999...的情况都会报错.......
函数说明:
function IncAPPNo( AppNo : string):string;stdcall;
var i : integer;
str : array[0..16] of char;
tmp : integer;
Ostr: string;
flag: integer;
sl : integer;
s : string;
begin

for I := 0 to 16 do
begin
str:='0';
end;
flag := 1;

if (length(Appno)>16) then
begin
showmessage('请控制交易序号在16位以内');
exit;
end;
strcopy(str,pchar(appno));

//字符长度
sl:=length(appno);

form1.Caption:='字符长度:'+inttostr(sl);

while (flag=1) do
begin
s := str[sl-1];
tmp := strtoint(s)+1;
s := inttostr(tmp);
showmessage(s[1]);
if (tmp = 10) then
begin
str[sl-1]:='0';
flag:=1;
end
else
begin

str[sl-1]:=s[1];
flag:=0;
end;
dec(sl);
end;
result := str;
end;
 
给一个好精点的给你
function IncAPPNo(AppNo: string): string;
var
i:integer;
s,s2:string;
begin
s := '00000000000000000000';
i := length(trim(AppNo)) ;
s2 := inttostr(strtoint(trim(AppNo)) + 1);
result := copy(s,1,i-length(s2)) + s2;
end;
 
我是想知道我写的错在哪里呢?
 
直接用:
Result := Format('%.16d', [StrToInt(AppNo)+1]);
好了。
 
function TForm1.IncAPPNo( AppNo : string):string;stdcall;
var i : integer;
str : array[0..16] of char;
tmp : integer;
Ostr: string;
flag: integer;
sl : integer;
s : string;
begin
if (length(Appno)>16) then
begin
showmessage('请控制交易序号在16位以内');
exit;
end;
//字符长度
sl:=length(appno);

for I := 0 to 16 do
begin

if i <= 16-Sl then
str:='0'
else
str := appno[sl-(16-i)]


end;
flag := 1;


//strcopy(str,pchar(appno));

sl:=17;

form1.Caption:='字符长度:'+inttostr(sl);

while (flag=1) do
begin
s := str[sl-1];
tmp := strtoint(s)+1;
s := inttostr(tmp);
//showmessage(s[1]);
if (tmp = 10) then
begin
str[sl-1]:='0';
flag:=1;
end
else
begin

str[sl-1]:=s[1];
flag:=0;
end;
dec(sl);
end;
result := str;
showmessage(str);

end;
你看下就知道你错在哪了.
1. 包含 字符#0
2. 计算算法不对.
 
to zhj09: 这样写是可以的。应该是初始化的时候出现的问题。先谢谢了,我稍后研究一下就给分:)
to louqing_2: delphi 中的integer 是32位(因此最大值是2147483647,即10位)的,如果超过10位,使用方法strtoint会报错的。
 
多人接受答案了。
 
后退
顶部