![]() |
Runden ohne nachfolgende Nullen
Hallo zusammen,
ich wollte die nachfolgenden Nullen einer Zahl abschneiden, und nach ein bischen rumgerechne hab ich es aber aufgegeben das mit Mathematik zu lösen, und habs dann doch wieder mit String-Operationen in einer Schleife gelöst. War wohl schon zu müde und hatte zu wenig Zeit. Aber trotzden würde mich interessieren wie man das am elegantester löst: Ich möchte Fließkommazahlen auf z.B. 3-nachkommastellen runden, und als String formatieren. Z.B. mit
Delphi-Quellcode:
.
LTxt := Format('%1.3f', [ dblNumber]);
Da kommt dann z.B. das raus: 1,234 2,404 2,001 1,000 1,100 1,403 2,330 Aber dann möchte ich die training Zero's löschen: 1,234 --> 1,234 2,404 --> 2,404 2,001 --> 2,001 1,000 --> 1 1,100 --> 1,1 1,040 --> 1,04 2,330 --> 2,33 Mit String-Operationen geht das, aber es sollte doch auch einen mathematischen Weg Geben, so ala
Delphi-Quellcode:
?
RoundTo(dblNumber, -3);
Wie würdet Ihr das machen ? Rollo |
AW: Runden ohne nachfolgende Nullen
Das ist ja eher eine Anzeigeproblem. Im Speicher unterscheidet sich 1 und 1,000 ja nicht.
|
AW: Runden ohne nachfolgende Nullen
Hi,
was stört dich an Funktionen wie FloatToStr oder FloatToStrF ? |
AW: Runden ohne nachfolgende Nullen
Ich möchte keine festen Nachkommastellen, sondern die nachfolgenden Nullen löschen.
Das geht ja wie gesagt als String-Schleife, von hinten nach vorne, alles was Null oder Komma ist Löschen bis was anderes kommt. Jedenfalls kan ich nicht z.B. im Format() die Stellen VOR der Konvertierung ändern, sondern ich möchte es automatisch am Ergebnis raushaben. Oder eben besser das die Nullen gar nicht erst entstehen. Wenn ich die z.B. die Funktion
Delphi-Quellcode:
benutze, dann wäre eine Formel für LPost nicht schlecht,
Format ('%*.*f', [LPre, LPost, 123.456]);
welche wiederung von der Zahl selbst abhängt: also 1.234 --> LPost = 3 (relevante Nachkommas) 1.230 --> LPost = 2 (relevante Nachkommas) 1.200 --> LPost = 1 (relevante Nachkommas) Wie könnte man LPost aus der FloatZahl berechen ? Rollo |
AW: Runden ohne nachfolgende Nullen
Zitat:
Sollte doch das machen? |
AW: Runden ohne nachfolgende Nullen
Zitat:
Code:
ungetestet
function makeStr(d : Double) : String;
var l,c : Integer; begin result := IntToStr(Trunc(d * 1000)); l := Length(result); c := 0; while (result[l-c] = '0') and (c<3) do c := c + 1; if (c>0) then // bis ende löschen Delete(result,l-c,l); if (c<3) then insert(',',result,l-c); end; cu Ha-Jö |
AW: Runden ohne nachfolgende Nullen
Ein inc(c) tut's auch.
gruss |
AW: Runden ohne nachfolgende Nullen
Zitat:
cu Ha-Jö |
AW: Runden ohne nachfolgende Nullen
Zitat:
Allerdings ist das Konzept schon seit 1969 bekannt und scheint in 2017 noch nicht angekommen zu sein. ![]() gruss |
AW: Runden ohne nachfolgende Nullen
Hallo,
meine Delphi-Version kann das (leider) noch nicht, du könntest aber die TStringHelper nutzen. Ich würde das dann so machen:
Delphi-Quellcode:
s := s.TrimRight([#048, #044]);
Edit: 800. :-) :party: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:30 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 by Thomas Breitkreuz