Avatar billede hugopedersen Nybegynder
04. marts 2010 - 09:09 Der er 10 kommentarer og
1 løsning

How dælen do I do this

I forbindelse med at jeg laver logfiler i mine programmer har jeg lavet det sådan at de nummereres fra 0 til 999
De 999 ligger i en konstant jeg har defineret
Jeg formaterer så filnavnet med programnavn+tal formateret'000'
Men da jeg lavede tallet om fra 99 til 999 glemte jeg at lave formatet om og det er jo noget rod.
Så mit spørgsmål er:
Hvis man har et tal kan man så tælle cifre i det på nogen måde så jeg kan lave en StringOfChar('0', x) og bruge som formatstreng.
Avatar billede preppydude Nybegynder
04. marts 2010 - 09:16 #1
Du kan gøre sådan her:
const
  ET_ELLER_ANDET = 4;
begin
  ShowMessage(Format('Tal med 3 "cifre": %.3d', [ET_ELLER_ANDET]));
end;
Avatar billede hugopedersen Nybegynder
04. marts 2010 - 10:58 #2
Er resultatet ikke det samme?

Konstanten definerer max værdi af tæller og det er hvis jeg ændrer den til 9999 at jeg gerne vil undgå at skulle ændre %.3d til %.4d

- 2 steder at vedligeholde = mindst 1 mulighed for fejl.
Avatar billede preppydude Nybegynder
04. marts 2010 - 11:22 #3
Ah, forstod ikke dit spørgsmål. :) Men du vil have den mindst skal skrive 3 cifre? fx 011?
Avatar billede preppydude Nybegynder
04. marts 2010 - 11:26 #4
Eller er det bare sådan noget her du er ude efter?

const
  ET_ELLER_ANDET = 4;
  MAX_VALUE = 9999;
begin
  ShowMessage(Format('%.'+IntToStr(Length(IntToStr(MAX_VALUE)))+'d', [ET_ELLER_ANDET]));
end;

Det kan nok gøres pænere, men har ikke tid til at undersøge det lige nu.
Avatar billede hugopedersen Nybegynder
04. marts 2010 - 11:27 #5
Den skal skrive lige så mange tegn som der er cifre i kostant der definerer max (99=2 999=3 9999=4) så det smarte ville være en funktion der kan finde ud af antal cifre i et tal.
Avatar billede hugopedersen Nybegynder
04. marts 2010 - 11:31 #6
Fik lige en ide:

function DigitsInteger(aValue: Integer): Integer;
  var
    sTemp: String;
begin
  sTemp := IntToStr(aValue);
  Result := Length(sTemp);
end;
Avatar billede hugopedersen Nybegynder
04. marts 2010 - 11:35 #7
Resultatet er jo det samme så smid et svar.
Avatar billede preppydude Nybegynder
04. marts 2010 - 11:36 #8
Her. :)
Avatar billede arne_v Ekspert
04. marts 2010 - 21:45 #9
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.
Avatar billede hugopedersen Nybegynder
05. marts 2010 - 08:18 #10
Det ser avanceret ud - men hvad det kan går over min forstand :-)
Avatar billede arne_v Ekspert
05. marts 2010 - 14:37 #11
Mine to pointer er at:

1) Length(IntToStr(v)) er en lidt primitiv maade at udregne bredden af et heltal - trunc(log10(v) + 1) er bedre

2) man behoever ikke putte et tal ind i format strehnegn, men kan putte en * i format strenge, saa tager den tallet fra argument listen
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester