De forskellige stykker vist kode virker jo fint.
Men jeg synes altså at der mangler lidt finesse.
Prøv og køre følgende to programmer:
program digits;
{$APPTYPE CONSOLE}
uses
SysUtils, Math, Windows;
function wid1(v : integer) : integer;
begin
wid1 := Length(IntToStr(v));
end;
function wid2(v : integer) : integer;
begin
if v < 0 then begin
wid2 := 1 + wid2(-v);
end else if v = 0 then begin
wid2 := 0;
end else begin
wid2 := trunc(log10(v) + 1);
end;
end;
function wid3(v : integer) : integer;
begin
if v < 0 then begin
wid3 := 1 + wid3(-v);
end else if v = 0 then begin
wid3 := 0;
end else begin
if v < 10000 then begin
if v < 100 then begin
if v < 10 then begin
wid3 := 1;
end else begin
wid3 := 2;
end;
end else begin
if v < 1000 then begin
wid3 := 3;
end else begin
wid3 := 4;
end;
end;
end else begin
if v < 1000000 then begin
if v < 100000 then begin
wid3 := 5;
end else begin
wid3 := 6;
end;
end else begin
if v < 10000000 then begin
wid3 := 7;
end else if v < 100000000 then begin
wid3 := 8;
end else if v < 1000000000 then begin
wid3 := 9;
end else begin
wid3 := 10;
end;
end;
end;
end;
end;
const
N = 10000000;
var
i, v, t1, t2 : integer;
begin
v := 1;
while v < 1000000000 do begin
writeln(wid1(v), ' ', wid2(v),' ', wid3(v));
v := 2 * v;
end;
randomize;
t1 := GetTickCount;
for i := 1 to N do begin
wid1(random(1000000));
end;
t2 := GetTickCount;
writeln(t2 - t1);
t1 := GetTickCount;
for i := 1 to N do begin
wid2(random(1000000));
end;
t2 := GetTickCount;
writeln(t2 - t1);
t1 := GetTickCount;
for i := 1 to N do begin
wid3(random(1000000));
end;
t2 := GetTickCount;
writeln(t2 - t1);
readln;
end.
program fmt;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
v : integer;
begin
v := 1;
while v < 1000000000 do begin
writeln(v:9);
writeln(Format('%9d', [v]));
writeln(Format('%*d', [9, v]));
writeln(Format('%9.9d', [v]));
writeln(Format('%*.*d', [9, 9, v]));
v := 2 * v;
end;
readln;
end.