Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Runden ohne nachfolgende Nullen (https://www.delphipraxis.net/191987-runden-ohne-nachfolgende-nullen.html)

Rollo62 10. Mär 2017 15:53

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

mkinzler 10. Mär 2017 16:08

AW: Runden ohne nachfolgende Nullen
 
Das ist ja eher eine Anzeigeproblem. Im Speicher unterscheidet sich 1 und 1,000 ja nicht.

Andidreas 10. Mär 2017 16:26

AW: Runden ohne nachfolgende Nullen
 
Hi,

was stört dich an Funktionen wie FloatToStr oder FloatToStrF ?

Rollo62 10. Mär 2017 17:16

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:
Format ('%*.*f', [LPre, LPost, 123.456]);
benutze, dann wäre eine Formel für LPost nicht schlecht,
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

Tyrolean 10. Mär 2017 17:33

AW: Runden ohne nachfolgende Nullen
 
Zitat:

Zitat von Rollo62 (Beitrag 1363756)
1,100
Rollo

Formatfloat('#,##0.###',1.1);

Sollte doch das machen?

hanvas 10. Mär 2017 18:48

AW: Runden ohne nachfolgende Nullen
 
Zitat:

Zitat von Rollo62 (Beitrag 1363756)
Hallo zusammen,

Wie würdet Ihr das machen ?

Rollo

Code:
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;
ungetestet

cu Ha-Jö

EWeiss 10. Mär 2017 20:06

AW: Runden ohne nachfolgende Nullen
 
Ein inc(c) tut's auch.

gruss

hanvas 10. Mär 2017 20:19

AW: Runden ohne nachfolgende Nullen
 
Zitat:

Zitat von EWeiss (Beitrag 1363768)
Ein inc(c) tut's auch.

gruss

Aus welchen Grund sollte ich inc verwenden? Das inc und dec scheller ist als +1/-1 halte ich für einen Mythos.

cu Ha-Jö

EWeiss 10. Mär 2017 20:27

AW: Runden ohne nachfolgende Nullen
 
Zitat:

Zitat von hanvas (Beitrag 1363769)
Zitat:

Zitat von EWeiss (Beitrag 1363768)
Ein inc(c) tut's auch.

gruss

Aus welchen Grund sollte ich inc verwenden? Das inc und dec scheller ist als +1/-1 halte ich für einen Mythos.

cu Ha-Jö

Hat niemand verlangt nur das es auch tut ;)
Allerdings ist das Konzept schon seit 1969 bekannt und scheint in 2017 noch nicht angekommen zu sein.

https://en.wikipedia.org/wiki/Increm...ment_operators

gruss

juergen 10. Mär 2017 20:42

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 07:33 Uhr.
Seite 1 von 3  1 23      

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