Tausenderpunkte einfügen
Thomas Meyer
- perl
Hallo zusammen,
ich suche verzweifelt eine (möglichst kurze) Perl-Funktion, mit der nach erfolgter Berechnung Tausenderpunkte in die Variable einfügen kann. Das soll möglichst nicht nur bei drei Nullen (also Tausend), sondern auch bei einem Vielfachen davon (z.B. bei einer Million) funktionieren.
besten Dank im voraus,
Thomas
Hallo Thomas,
versuch es mal mit
$wert =~ s/(\d{1,3})(?=(\d{3})+($))/$1./g;
Norbert
Hallo Thomas,
versuch es mal mit
$wert =~ s/(\d{1,3})(?=(\d{3})+($))/$1./g;
Norbert
Danke Norbert, hat (nach einer kleiner Anpassung) super geklappt!
Die obige Syntax hat (vermutlich aufgrund der beiden Nachkommastellen) zu recht wirren Ergebnissen geführt. Ich habe dann (Try and error) den Ausdruck ($) durch ein Komma ersetzt, um die Ersetzung auf den Vorkommateil zu begrenzen. Ich weiss zwar nicht genau warum, da ich Deinen Ausdruck nicht 100%ig nachvollziehen konnte (was ?= z.B. bewirkt, konnte ich in der Doku nicht finden), aber es funktioniert (inzwischen sogar ohne das ?=). Die Syntax, die ich jetzt verwende, lautet also:
$wert =~ s/(\d{1,3})(\d{3})+,/$1./g;
Nochmals Danke,
Thomas
hi!
Ich weiss zwar nicht genau warum, da ich Deinen Ausdruck nicht
100%ig nachvollziehen konnte (was ?= z.B. bewirkt, konnte ich in
der Doku nicht finden), aber es funktioniert (inzwischen sogar
ohne das ?=). Die Syntax, die ich jetzt verwende, lautet also:
$wert =~ s/(\d{1,3})(\d{3})+,/$1./g;
Ich glaube nicht, dass das so funktioniert, denn damit verwirfst du
ja einen Teil deines Ausdrucks -- bzw. du ersetzt den kompletten
Ausdruck durch einen Teil davon. (?=<pattern>) ist eine positive
look-ahead Anweisung[1], die dafür sorgt, dass der Teil des Ausdrucks
beim Ersetzen später keine Rolle mehr spielt. Also genau das, was du
eigentlich haben willst.
Merke: lieber nicht zuviel in unbekannten regulären Ausdrücken
rumspielen... ;)
bye, Frank!
[1] siehe auch perldoc perlre
Hallo Thomas!
Ich hatte nicht daran gedacht, daß Du vielleicht nicht nur ganze Zahlen bearbeiten willst (wie dies bei meiner Anwendung der Fall war). Eine Änderung ist also notwendig, aber Frank hat Recht: Deine Änderung führt zu Fehlern.
Ich bin nicht mal eben auf eine Lösung mit einem einfachen regulären Ausdruck gekommen, deshalb hier eine weniger elegante:
$wert="19876,5432";
&tausenderpunkte($wert);
print "$wert\n";
sub tausenderpunkte
{
my @teilwert = split(/,/,$_[0]);
$teilwert[0] =~ s/(\d{1,3})(?=(\d{3})+($))/$1./g;
$_[0]=$teilwert[0];
if ($teilwert[1]) { $_[0].=",$teilwert[1]" };
}
Norbert