printf und tausenderstellen
hannes kraft
- perl
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
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önnenich 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
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