Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi länge zweier integer werte vergleichen (https://www.delphipraxis.net/132728-laenge-zweier-integer-werte-vergleichen.html)

gangs-taas 18. Apr 2009 11:38


länge zweier integer werte vergleichen
 
hey,
ich hab mal ne frage.
also ich habe 2 variablen mit integer werten.
nun möchte ich diese vergleichen und dann den kürzeren verändern.
beispie

Variable1 := 100
Variable 2 := 1000

dann soll er vergleichen ob variabel2 mehr zeichen beinhaltet und wenn ja vor Variable 1 so viele '0' machne, dass das gleich ist.

also aus
Variable1 soll dann 0100 werden.

ich bekomme aber das nicht mit der hilfe vom internet hin.

dacht vllt mit

Delphi-Quellcode:
repeat
Variable1 := '0' + Variable1
until ((Length(Variable1) = (Length(Variable2)))

aber das klapt nicht ....

hoffe ihr versteht wie ich das mein und könnt mir helfen ^^

lg ^^

Luckie 18. Apr 2009 11:41

Re: länge zweier integer werte vergleichen
 
Ich weiß zwar nicht, in wie fern dir das Internet dabei helfen soll, aber egal. Du willst also, die Zahl mit nullen vorne auffüllen um sie dann auszugeben. Richtig? Dann guck dir mal die Delphi-Referenz durchsuchenFormat Funktion an. Damit sollte das möglich ein.

DeddyH 18. Apr 2009 12:34

Re: länge zweier integer werte vergleichen
 
Du musst die beiden Variablen in Strings wandeln und dann deren Länge vergleichen.

Luckie 18. Apr 2009 14:20

Re: länge zweier integer werte vergleichen
 
Brauch er nicht. Format macht das von alleine.

DeddyH 18. Apr 2009 14:23

Re: länge zweier integer werte vergleichen
 
Und woher soll Format wissen, wie lang der längere String ist? AFAIK kann man da nur feste Längen angeben, oder hab ich was übersehen?

Luckie 18. Apr 2009 14:25

Re: länge zweier integer werte vergleichen
 
Das sollen sie ja auch, wenn ich das richtig verstanden habe. Man gibt fünf Stellen an und alle kürzeren wrden mit nullen aufgefüllt.

DeddyH 18. Apr 2009 14:27

Re: länge zweier integer werte vergleichen
 
Zitat:

Zitat von gangs-taas
dann soll er vergleichen ob variabel2 mehr zeichen beinhaltet und wenn ja vor Variable 1 so viele '0' machne, dass das gleich ist.

Ich verstehe das so, dass beide auf die gleiche (variable) Länge gebracht werden sollen.

Luckie 18. Apr 2009 14:30

Re: länge zweier integer werte vergleichen
 
Werden sie ja auch:
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
var
  i: Integer;
  s: String;
begin
  i := 50;
  s := Format('%.4d',[i]);
  ShowMessage(s);
end;
Bei 50 ist das Ergebnis "0050" und bei 500 "0500".

himitsu 18. Apr 2009 14:41

Re: länge zweier integer werte vergleichen
 
und mit ein paar Logarithmen (oder so) könnte man auch mathematisch rausbekommen welche Zahl wie lang ist ... OK, oder über IntToStr+Length (is nur langsamer)

Delphi-Quellcode:
MaxLen = {größte Länge der beiden Zahlen als String};
String1 := Format('%.*d', [MaxLen, Variable1]);
STring2 := Format('%.*d', [MaxLen, Variable2]);
voll unperformat, aber es läuft:
Delphi-Quellcode:
String1 := IntToStr(Variable1);
STring2 := IntToStr(Variable2);
While Length(String1) < Length(String2) do String1 := '0' + String1;
While Length(String2) < Length(String1) do String2 := '0' + String2;


[add]
Delphi-Quellcode:
// einfach

MaxLen = Max(Length(IntToStr(Variable1)), Length(IntToStr(Variable2)));
String1 := Format('%.*d', [MaxLen, Variable1]);
String2 := Format('%.*d', [MaxLen, Variable2]);

// schnell(er)

Function NumLen(i: Integer): Integer;
  Begin
    If i = 0 Then
      Result := 1
    Else If i > 0 Then
      Result := Trunc(Log10(Variable1)) + 1
    Else
      Result := Trunc(Log10(-Variable1)) + 1;
  End;

MaxLen = Max(NumLen(Variable1), NumLen(Variable2));
String1 := Format('%.*d', [MaxLen, Variable1]);
String2 := Format('%.*d', [MaxLen, Variable2]);

gangs-taas 18. Apr 2009 15:12

Re: länge zweier integer werte vergleichen
 
hey,
erstmal danke für eure hilfe!

ich hab mir eure code angeguckt und habe festegestellt das ich bei manchen sachen keine arnung habe was die bedeuten.


in disem code (ich nehm ihn weil ich denke es ist der einfachste


MaxLen = Max(Length(IntToStr(Variable1)), Length(IntToStr(Variable2)));
String1 := Format('%.*d', [MaxLen, Variable1]);
String2 := Format('%.*d', [MaxLen, Variable2]);

was bedeutet das 'max' in der ersten Zeiel ist das nen befehl oder ne variable ?

und das %.*d was bedeutet das ?

und meine dritte frage wird in der letzten zeile string2 nicht auch verändert ? aber es soll ja nur string 1 so mit '0' "aufgefüllt" werden das es gleichlang ist wie string 2 ...



sorry fals das dumme fragen sind .

lg ^^

Yogu 18. Apr 2009 15:18

Re: länge zweier integer werte vergleichen
 
Zitat:

Zitat von gangs-taas
was bedeutet das 'max' in der ersten Zeiel ist das nen befehl oder ne variable ?

Schau mal in der Online-Hilfe (F1) ;)

Max gibt einfach den größeren der beiden Parameter zurück.

Zitat:

Zitat von gangs-taas
und das %.*d was bedeutet das ?

Schau mal in der Online-Hilfe unter "Format" :mrgreen:

Zitat:

Zitat von gangs-taas
und meine dritte frage wird in der letzten zeile string2 nicht auch verändert ? aber es soll ja nur string 1 so mit '0' "aufgefüllt" werden das es gleichlang ist wie string 2 ...

Wieso nur String1? Wenn String2 kleiner ist, dann soll doch auch dieser aufgefüllt werden, oder? MaxLen ist aber die Länge des größsten Strings, und so wird ein String nicht bearbeitet, da die gewünschte Länge gleich der momentanen Länge ist.

Zitat:

Zitat von gangs-taas
sorry fals das dumme fragen sind .

Es gibt keine dummen fragen, nur dumme Antworten. Und eine F1-Taste :mrgreen:

Grüße,
Yogu

gangs-taas 18. Apr 2009 15:53

Re: länge zweier integer werte vergleichen
 
okay
danke

gangs-taas 18. Apr 2009 18:54

Re: länge zweier integer werte vergleichen
 
hey,
ich habe jetzt diesen code genommen, bekomme aber Fehlermeldungen.

Delphi-Quellcode:
MaxLen = Max(Length(IntToStr(Variable1)), Length(IntToStr(Variable2))); // Inkompatible Typen: 'string' und 'Integer'
String1 := Format('%.*d', [MaxLen, Variable1]);// Inkompatible Typen Integer und String
String2 := Format('%.*d', [MaxLen, Variable2]); // Inkompatible Typen Integer und String

worand könnte das liegen bzw wie kann ich das ändern ?

himitsu 18. Apr 2009 19:04

Re: länge zweier integer werte vergleichen
 
wie hast du denn deine Variablen definiert?

z.B.:
Delphi-Quellcode:
var String1, String2: String;
  MaxLen, Variable1, Variable2: Integer;

gangs-taas 18. Apr 2009 19:05

Re: länge zweier integer werte vergleichen
 
ich überprüf es eben ^^

edit
hatte die varialben echt falsch definiert




dafür gibs wenn ich das 'programm' ausführe nen anderen fehler nämlich :

Format '%."d' ungültig oder nicht kompatibel mit Argument.

toll ich weiß nicth was Delphi von mir will xD

taaktaak 18. Apr 2009 19:37

Re: länge zweier integer werte vergleichen
 
Na, für 'nen Anfänger ein wenig undurchsichtig, mit
Zitat:

Format('%.*d' .......
hat himitsu gemeint, du musst anstelle des * eine beliebige Zahl einfügen (=WildCard). Also z.B. '%.4d' damit wird die Ausgabe immer auf eine Breite von 4 Zeichen/Ziffern gebracht.

gangs-taas 18. Apr 2009 19:42

Re: länge zweier integer werte vergleichen
 
aber ich will das nicht auf 4 sonder auf (length(Variable2) zeichen bringen
also auf die länge einer variable

geht das auch ?!

DeddyH 18. Apr 2009 19:42

Re: länge zweier integer werte vergleichen
 
Oder so:
Delphi-Quellcode:
MaxLen := Max(Length(IntToStr(Variable1)), Length(IntToStr(Variable2)));
FormatString := Format('%%.%dd',[MaxLen]);
String1 := Format(FormatString, [Variable1]);
String2 := Format(FormatString, [Variable2]);
Ungetestet, sollte nach meinem Dafürhalten aber funktionieren.

gangs-taas 18. Apr 2009 20:12

Re: länge zweier integer werte vergleichen
 
jetzt geht es erst
aber wenn ic hdas programm ausführe bekomme ich die meldung

'%.2d' ist ungültig wobei die Zahl sich immer ändert (wenn ich das programm wieder ausführe)
was ja aber eigl. auch richtig ist...

DeddyH 18. Apr 2009 20:14

Re: länge zweier integer werte vergleichen
 
Sind das auch wirklich Integerwerte, die Du übergibst?

himitsu 18. Apr 2009 20:33

Re: länge zweier integer werte vergleichen
 
neee, ich weiß, daß Format('%8.2d', [123]) einem Format('%*.*d', [8, 2, 123]) entspricht, daher dachte ich jetzt einfach mal, das Format('%.5d', [123]) einem Format('%.*d', [5, 123]) entspräche ... hab's aber nicht getestet :oops:

vielleicht geht ja ein :gruebel:
Delphi-Quellcode:
String1 := Format('%*.*d', [0, MaxLen, Variable1])
die OH meint zumindestens sowas:
Zitat:

Die Bezeichner für Index, Breite und Genauigkeit können direkt durch Angabe eines Strings mit dezimalen Ziffern (z.B. "%10d") oder indirekt mit Hilfe von Sternchen (z.B. "%*.*f") angegeben werden. Im letzteren Fall wird das Argument, das in der Argumentliste auf das Sternchen folgt (es muss sich dabei um einen Integerwert handeln), als tatsächlicher Wert verwendet. Beispiel:

Delphi-Quellcode:
Format('%*.*f', [8, 2, 123.456]);


DeddyH 18. Apr 2009 20:36

Re: länge zweier integer werte vergleichen
 
Meine Variante mit dem "Zwischenformat" geht jedenfalls (ich war neugierig und habe es dann selbst ausprobiert). Der Fehler muss woanders liegen.

gangs-taas 18. Apr 2009 20:54

Re: länge zweier integer werte vergleichen
 
mein quelltext

fehlersuche xD mit breakpoints komm ich auf die zeile mit "%.2d"

aber hier mein ganzer code

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
Vza,Vzb, Vzz : real;
a,x,c,d,b : integer;
Va, Vb, VZ: integer;
MaxLen : Integer;
Vzza, vzzz : String;
FormatString : String;
begin
a:= StrToInt(Edit2.Text[1]);
x:= StrToInt(Edit2.Text[2]);
b:= StrToInt(Edit2.Text[3]);
c:= StrToInt(Edit2.Text[4]);
d:= StrToInt(Edit2.Text[5]);
Vza := a*sqr(x) + b*x + c;
Va := (Round(Vza));
x := x+d;
Vzb := a*sqr(x) + b*x + c;
Vb := (Round(Vzb));
x := x + (26*d);
Vzz := a*sqr(x) + b*x + c;
Vz := (Round(Vz));
   MaxLen := Max(Length(IntToStr(Va)), Length(IntToStr(Vz)));
   FormatString := Format('%%.%dd',[MaxLen]);
   Vzza := Format(FormatString, [Vzza]);
   Vzzz := Format(FormatString, [Vzzz]);
Memo1.Text := 'a = ' + Vzza + #13#10 + 'B = ' + IntToStr(Vb) + #13#10 + 'Z = ' +Vzzz;
ich hoffe ihr könnt damit was anfangen xD also Vzza und Vzzz sind die variablen die vorher "variable1" und "variable2" waren ...

DeddyH 18. Apr 2009 20:59

Re: länge zweier integer werte vergleichen
 
Delphi-Quellcode:
Vzza := Format(FormatString, [Va]);
Vzzz := Format(FormatString, [Vz]);
Sinnige Variablenbezeichner sind übrigens Gold wert.

himitsu 18. Apr 2009 21:14

Re: länge zweier integer werte vergleichen
 
Zitat:

Zitat von DeddyH
Sinnige Variablenbezeichner sind übrigens Gold wert.

und wie, wobei eine hübsche Einrükung auch gut ankommt :angel:

und die ganzen Round sind "sinnlos", da es eh schon integer sind :zwinker:

Delphi-Quellcode:
...
Vz := (Round(Vz));
MaxLen := Max(Length(IntToStr(Va)), Length(IntToStr(Vz)));
FormatString := Format('a = %%.%0:dd'#13#10'B = %%d'#13#10'Z = %%.%0:dd', [MaxLen]);
Memo1.Text := Format(FormatString, [Va, Vb, Vz]);
obwohl ich mich frag, was bei den * falsch sein soll :gruebel:
denn ich hab es grad geprüft (in D7) und es gehen beide Varianten.
Delphi-Quellcode:
...
Vz := (Round(Vz));
MaxLen := Max(Length(IntToStr(Va)), Length(IntToStr(Vz)));
Memo1.Text := Format('a = %.*d'#13#10'B = %d'#13#10'Z = %.*d', [MaxLen, Va, Vb, MaxLen, Vz]);

// bzw.

...
Vz := (Round(Vz));
MaxLen := Max(Length(IntToStr(Va)), Length(IntToStr(Vz)));
Memo1.Text := Format('a = %*.*d'#13#10'B = %d'#13#10'Z = %*.*d', [0, MaxLen, Va, Vb, 0, MaxLen, Vz]);

DeddyH 18. Apr 2009 21:32

Re: länge zweier integer werte vergleichen
 
Es hat ja niemand gesagt, dass die * falsch waren. Der Fehler lag ja darin, dass er %d auf String anwenden wollte.

gangs-taas 18. Apr 2009 22:06

Re: länge zweier integer werte vergleichen
 
danke probier das lgeich aus

und zu den variablen namen die ham schon nen sinn.
aber da meine idee noch sehr wenig ausgereift ist hat's nicht viel sinn da genau jetzt schon zu beschreiben xD


danke aber für eure hilfe


edit
es klappt aber immer noch nicht.
hab das mal mit (random) zufälligen zahlen ausprobiert und dann kommt raus

a = 616
B = 2093
Z = 000


wobei ja Z eigendlich was anderes als 000 sein sollte (was es aber egal bei welcher zufälligen zahl ) ist
und a sollte ja eigendlich 0616 sein !!

also klapps nicht !

Muetze1 18. Apr 2009 22:24

Re: länge zweier integer werte vergleichen
 
Delphi-Quellcode:
var
  lLen: integer;
  s1, s2: string;
begin
  s1 := IntToStr(a);
  s2 := IntToStr(b);

  lLen := max(length(s1), length(s2));
 
  s1 := StringOfChar(' ', lLen-length(s1)) + s1;
  s2 := StringOfChar(' ', lLen-length(s2)) + s2;

  Memo1.Lines.Add(s1);
  Memo1.Lines.Add(s2);
end;

gangs-taas 19. Apr 2009 13:29

Re: länge zweier integer werte vergleichen
 
danke
nun geht es


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz