Jörk Behrends: Perl: Zahlen runden auf x dez. Stellen

Beitrag lesen

Hallo Stefan!

Eine dritte Moeglichkeit stellen Regular Expressions dar. Da Perl jede Variable so behandelt, wie man es geade will, kann man auch Suche-Ersetze-Funktionen fuer Zeichenketten auf Zahlen loslassen. Aber: das folgende Beispiel packe ich auch nicht ganz. Ich bekomme immer entweder eine oder drei Nachkommastellen heraus, nie zwei (ich vermute aber eher mal, dass es an meinen Faehigkeiten liegt, RegExps perfekt einzusetzen). Hier das Prinzip:

print "Content-type: text/html\n\n";
   print "<html><head></head><body>\n";

$test = 3 / 7;
   $test =~ s/.(\d{2})*/.\1/g;
   print "$test";

print "</body></html>\n";

Das mit den RegExps ist nicht immer ganz so einfach, wie man denkt... Ich mußte auch
erst freimal hinschauen, bevor ich überhaupt einen Fehler gesehen habe ;-)

In Deinem Beispiel bekommst Du in $test eine Zahl mit 15 Nachkommastellen. Die RE nun sucht
nach einem Punkt gefolgt von einer geraden Anzahl von Ziffern (also 14). Über die Klammern
werden die ersten beiden Ziffern "festgehalten" und anschließend über \1 wieder eingesetzt.
Die Option "g" zieht hier leider nicht, da sie nur die wiederholte Anwendung der RE auf den
original Text bewirkt - nicht jedoch auf einen manipulierten ... Mal abgesehen davon, daß Deine
RE keine Rundung durchführt, müßte sie in zwei Beziehungen verändert werden:
1. bei einer ungeraden Anzahl von Stellen, muß auch das letzte Zeichen mit entfernt werden
2. bei weniger als zwei Stellen sollten noch Nullen angehängt werden

Lösung könnte sein (es gibt ja immer viele Arten ein Problem zu lösen):

$test =~ s/.(\d{0,2})\d*/.$1/;
   Um nur die ersten beiden Stellen auszugeben

$test =~ s/.(\d{0,2})\d*/substr(".${1}00",0,3)/e;
   Um die Nachkommastellen mit Nullen aufzufüllen

$test =~ s/(.(\d{0,2})\d*)?$/substr(".${1}00",0,3)/e;
   Um auch Zahlen ohne Komma mit zwei Nachkommastellen darzustellen

Hoffe das hilft vielleicht auch beim eigentlichen Problem weiter,

Gruß Jörk