Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Zahl umklappen lassen auf -Wert? (https://www.delphipraxis.net/36854-zahl-umklappen-lassen-auf-wert.html)

Pseudemys Nelsoni 27. Dez 2004 09:28


Zahl umklappen lassen auf -Wert?
 
hi,

wenn ich eine zahl habe und Inc() benutze und das über den bereich gehen würde, würd es ja automatisch auf den höchsten negativen wert springen..... nun brauch ich eine funktion die genau DAMIT klar kommt. Z.B bekomme ich bei diesem hier:

Delphi-Quellcode:
showmessage(inttostr(strtoint('456165165465165464')));
ein EConvertError statt z.b ein en negativen wert... wie mache ich das das ich auch negative werte angezeigt bekomme ?

mirage228 27. Dez 2004 09:32

Re: Zahl umklappen lassen auf -Wert?
 
Hi,

ich weiss nicht, in wie fern das hilfreich für Dich ist, aber so geht es:

Delphi-Quellcode:
  ShowMessage(IntToStr(StrToInt64('456165165465165464')));
mfG
mirage228

Pseudemys Nelsoni 27. Dez 2004 09:38

Re: Zahl umklappen lassen auf -Wert?
 
hallo mirage,

danke für deine antwort, leider geht das nicht, bzw so sollte es nicht sein. Es geht darum das ein User einen string, der vom server in eine zahl umgewandelt werden soll. Sollte das Maximale eines Integers überschritten werden, soll der wert einfach umklappen (fängt bei - an).

Ich schreibe gerade einen Server und muss ein genaues abbild eines bereits vorhandenen (nicht meiner) Server machen.

Wenn ich an den fremden Server folgendes Sende:

Zitat:

irc.hempstar.net KILLS 2147483648 // << 1 Zahl über dem möglichen!
Sendet mir der Server als Antwort:

Zitat:

:irc.hempstar.net 311 pseudemys -2147483648

^^^^den überschlagenen wert.

genau so muss ich das auch machen, nur wie?

glkgereon 27. Dez 2004 10:18

Re: Zahl umklappen lassen auf -Wert?
 
du machst aus dem int nen string, also max-wert und jetziger wert

beides in nen string.
bei beiden soviele nullen vorne einfügen bis er 15 stellen lang ist oder so...

vergleichen

wenn größer, dann ein '-' davor

oder so in etwa ;)

Pseudemys Nelsoni 27. Dez 2004 11:58

Re: Zahl umklappen lassen auf -Wert?
 
hallo glk,

hm, das muss auch einfacher gehen, also ohne das in einen string umzuwandeln. Inc() tut ja genau das was ich eigentlich möchte, nur kann ich ja hier kein Inc() verwenden da ich ja nur einen wert "nehme" und ihn nicht inkrementiere

glkgereon 27. Dez 2004 12:00

Re: Zahl umklappen lassen auf -Wert?
 
wozu brauchst du da inc()???

Urba 27. Dez 2004 12:04

Re: Zahl umklappen lassen auf -Wert?
 
Hallo,

Vielleicht so ...

Delphi-Quellcode:
var Zahl : Integer;

if Zahl > MaxInt then Zahl := -Zahl
Gruss
Urba

Pseudemys Nelsoni 27. Dez 2004 12:05

Re: Zahl umklappen lassen auf -Wert?
 
ich hab ja gesagt das inc() hier keinen sinn macht.

mach mal folgendes:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
begin
  i := 2147483647;
  inc(i);
  showmessage(inttostr(i));
end;
^^^da tut inc genau das was ich eigentlich möchte, es klappt den wert um wenn er über 2147483647 ist.

so wenn ich nun einen string umwandeln möchte der die zahl "2147483648" enthält gibts nen convert error... naja ich möchte dann halt -2147483648 bekommen und keinen fehler...



@Urba: Ein wert kann ja auch mehrmals umklappen je nachdem wieviel mal er grösser ist, also muss das ergebniss nicht unbedingt ein negativer wert sein, also klappt das auch nicht

Oxmyx 27. Dez 2004 12:11

Re: Zahl umklappen lassen auf -Wert?
 
Wenn's nur um den EConvertError geht, gibt's auch die Funktion StrToIntDef, mit der du einen Default-Wert zurückgeben kannst, wenn ein Fehler auftritt.

Pseudemys Nelsoni 27. Dez 2004 12:22

Re: Zahl umklappen lassen auf -Wert?
 
StrToIntDef gibt aber 0 zurück wenn der übergebene string über dem wertebereich eines integers liegt, statt ihn umzuklappen

tommie-lie 27. Dez 2004 12:31

Re: Zahl umklappen lassen auf -Wert?
 
Kommt drauf an, wie groß die Eingabe sein kann. Solange es noch in einen Int64 passt, kannst du die eingegebene Zahl in einen Int64 umwandeln. Anschließend schaust du, wie oft High(Integer) dort reinpasst (geht bspw. mit div). Ist das Ergebnis gerade, ist das Vorzeichen positiv, ist es ungerade ist das Vorzeichen negativ (ließe sich als 1 und -1 in einer weiteren Variable speichern). Anschließend nimmst du die Differenz und hast einen "übergelaufenen" Integer-Wert mit korrektem Betrag und Vorzeichen.
Ist die eingegebene Zahl schon größer als 2^63-1 brauchst du sowieso eine externe Bibliothek zum Verarbeiten der großen Werte, das Prinzip ist aber das gleiche: Lasse einen Integer so oft um 1 erhöhen, bis die Zahl dem eingegebenen Wert entspricht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:26 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