Thomas Meyer: Tausenderpunkte einfügen

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

  1. Hallo Thomas,

    versuch es mal mit
    $wert =~ s/(\d{1,3})(?=(\d{3})+($))/$1./g;

    Norbert

    1. 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

      1. 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

        1. 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