Hallo,
ich möchte gerne in Perl Gleitpunktzahlen normalisieren:
a) rechtsstehende Nullen aus dem Nachkomma-Anzeil abtrennen und
b) einen danach überflüssigen Dezimalpunkt ebenfalls entfernen.
Ich gehe mal davon aus, das Du eine Bruchdarstellung von Integern wieder in "richtige" Integer umwandeln möchtest, ja?
Hörte sich zumindest so an.
Also z.B.:
123.00 zu 123
567567.0000000 zu 567567
?
Mein Lösungsversuch
# Gleitpunkt-Darstellung normalisieren
# (rechtsstehende Nachkomma-Nullen entfernen)
if ($zahl =~ /^(\d+).(\d*?)0+$/)
{
my ($vorkomma, $nachkomma) = ($1, $2);
if ($nachkomma) { $vorkomma .= '.'; }
$zahl = $vorkomma . $nachkomma;
}
scheint zwar zu funktionieren, kommt mir aber nicht arg 'perlish' vor.
Das ist mit Sicherheit nicht "perlish", denn es ist gut lesbar, verständlich und ist nicht in einer Zeile.
SCNR >;->
Aber ich habe Dich wohl mißverstanden, denn der RegEx sagt mir sowas wie:
123.1230000 zu 123123
Geht das nicht irgendwie noch deutlich eleganter?
Wenn es nur Nullen sind:
$zahl = 123.000 # eine Zahl.
if ($zahl =~ /^(\d+).0+$/)
{
$zahl = sprintf "$lu",$zahl;
}
(Aber sprintf ist erstens teuer, sagt perldoc und zweitens war das ja sowieso nicht gefragt ;-)
$zahl = 123.123000;
if ($zahl =~ /^(\d+).(\d*?)(0*)$/)
{
$zahl = $1 . $2;
}
print $zahl; # ergibt 123123,
# Test:
# mit $zahl = $1 . $2 . $3 ergibt es 123123000
Wenn Du den Test nicht brauchst (also genau weißt, das es sich um eine Zahl handelt) reicht auch:
$zahl =~ s/^(\d+).(\d*?)(0*)$/$1$2/;
Das sieht dann wenigstens schon ansatzweise "perlish" aus. ;-)
(Hoffentlich stimmt das auch alles, habe nur die Funktion geprüft, nicht auf Fehler oder gar irgendwelche Seiteneffekte)
Ach ja, das Ganze läuft als eine von vielen Teilfunktionen über eine
Datei mit 757 MB, und das Ganze ist Bestandteil eines täglich laufenden
Produktionsjobs - eine performante Lösung wäre mir also nicht unlieb. ;-)
Tja, das wäre dann noch zu testen. Zumindest wären zwei Variablen gespart und eine Prüfung, im zweitem Fall sogar noch eine Prüfung.
Aber ich bin nicht der Perlspezialist und eigentlich bin ich ja auch nur aufgestanden, weil die Blase voll war ;-)
Da sind doch mit Sicherheit ein paar mathematische Funktionen in Perl, oder? Wenn es ein Float ist, also eine reguläre Zahl, sollte ein wenig Exponentialrechnung eigentlich besser behilflich sein. Wenn Modulo Floats unterstützt wäre es auch einfacher.
so short
Christoph Zurnieden