hannes kraft: printf und tausenderstellen

hallo leute,

hat jemand eine idee wie mit perl aus einer fliesskommazahl
eine lesbare ausgabe erstellt werden kann, in der die zahlen
durch leerstellen getrennt sind

beispiel:

printf("%10.2f", 2304);

ergibt  2304.00

nun hätte ich aber gerne dass hier 2 304.00 steht damit
die menschen (und ich auch) die sache besser lesen können

ich suchte bis jetzt nach einer eleganten methode - mit
einer lässigen schleife lässt sich sowas natürlich auch
realisieren - ist mir klar :)

servus
hannes

  1. Hallo Hannes!

    beispiel:

    printf("%10.2f", 2304);

    ergibt  2304.00

    nun hätte ich aber gerne dass hier 2 304.00 steht damit
    die menschen (und ich auch) die sache besser lesen können

    ich suchte bis jetzt nach einer eleganten methode - mit
    einer lässigen schleife lässt sich sowas natürlich auch
    realisieren - ist mir klar :)

    Mir fallen bei so einem Problem immer nur RegularExpressions ein ;-)

    Das Problem hierbei ist, daß man nicht einfach Dreierblöcke von vorne nach hinten nehmen kann. Diese sollte ja nun vom Punkt (oder vom Zeilenende) aus gebildet werden. Wenn ich aber beim Punkt anfange, müssten die nächsten Ersetzungen weiter links ansetzten. Eine RE wird aber mehrfach nur von links nach rechts angewendet!

    Ich muß also am Anfang einen ein bis drei Zeichen langen Block "\d{1,3}" finden, dem bis zu einem Punkt oder dem Zeilenende "(.$)" eine beliebige anzahl von Dreierblöcken folgt "(\d{3})+". Diese Blöcke darf ich aber nur als lookahead suchen, da ein folgender Ersetzungsdurchgang diese mitbearbeiten soll "(?= ... )"

    Das zusammen ergibt:
    $zahlAlsText =~ s/(\d{1,3})(?=(\d{3})+(.$))/$1 /g;

    Jetzt gibt es nur noch ein Problem: Die Zahlenketten hinter dem Punkt werden auch bearbeitet, wenn dort mindestens vier Stellen auftachen :(

    Aber ich will ja auch nicht alles verraten ;-)

    Viel Spaß,
      Jörk

  2. hallo forum,

    ich nehme mal an, dass es keine einfache formatierungsmöglichkeit
    gibt und aus diesem grund niemand geantwortet hat.

    natürlich muste ich trotzdem eine lösung finden und beantworte
    die frage nun selbst

    nach wenigen sekunden erkannte ich dass mit dem printf befehl
    ja die genaue länge des strings bekannt ist und die ganze sache
    somit einfach war

    beispiel:

    $summe = "23146.8546";
      $ausgabe_summe = sprintf("%13.2f", $summe);
      # ich finde ein komma sympathischer als den punkt:
      $ausgabe_summe =~ s/./,/g;
      $ausgabe_summe_neu = substr($ausgabe_summe,0,1) . " " .
                           substr($ausgabe_summe,1,3) . " " .
                           substr($ausgabe_summe,4,3) . " " .
                           substr($ausgabe_summe,7,6);
      print $ausgabe_summe_neu;

    ergibt:
      23 146,85

    bei beträgen über 9 milliarden muss man das script erweitern
      - ich schätze das dürfte bei meinem bescheidenem hardwarehandel
      noch eine weile dauern *g*

    sollte ich noch etwas übersehen haben, wäre ich für diesbezügliche
    hinweise sicher dankbar.

    hannes