![]() |
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:
ein EConvertError statt z.b ein en negativen wert... wie mache ich das das ich auch negative werte angezeigt bekomme ?
showmessage(inttostr(strtoint('456165165465165464')));
|
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:
mfG
ShowMessage(IntToStr(StrToInt64('456165165465165464')));
mirage228 |
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:
Zitat:
^^^^den überschlagenen wert. genau so muss ich das auch machen, nur wie? |
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 ;) |
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 |
Re: Zahl umklappen lassen auf -Wert?
wozu brauchst du da inc()???
|
Re: Zahl umklappen lassen auf -Wert?
Hallo,
Vielleicht so ...
Delphi-Quellcode:
Gruss
var Zahl : Integer;
if Zahl > MaxInt then Zahl := -Zahl Urba |
Re: Zahl umklappen lassen auf -Wert?
ich hab ja gesagt das inc() hier keinen sinn macht.
mach mal folgendes:
Delphi-Quellcode:
^^^da tut inc genau das was ich eigentlich möchte, es klappt den wert um wenn er über 2147483647 ist.
procedure TForm1.Button1Click(Sender: TObject);
var i: integer; begin i := 2147483647; inc(i); showmessage(inttostr(i)); end; 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 |
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.
|
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
|
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