phpbar.de logo

Mailinglisten-Archive

[php] Probleme mit printf()

[php] Probleme mit printf()

Ulf Wendel ulf_(at)_redsys.de
Fri, 28 Jan 2000 18:32:11 +0000


Alex Meyer wrote:
> Ich lese im Moment das PHP Buch von Jörg Krause. Bis jetzt kapier ich auch
> alles, aber mit dem printf() Befehl komme ich irgendwie nicht klar. Wie
> funktioniert das mit den Platzhaltern?? Muss ich denen bestimmte Namen
> geben??
> Ich kapier den einfach nicht :-( . Ich hab auch schon im Buch von Egon

Also Alex, dann stellst Du dich aber auch besonders schwierig an. So
schwierig ist das alles nicht.

printf() ist eigentlich nicht viel mehr als ein print. Es tut gar nicht
weh. In der einfachsten Variante benutzt man es auch wie print():

printf("Hallo!");

printf() kann jedoch noch viel mehr. Man kann printf benutzen um
Leerzeichen einzufügen, Dezimal in Hexadezimal zu wandeln und sogar zum
runden. 

Was es alles kann steht in der Doku zu sprintf() -
http://www.php.net/manual/function.sprintf.php3. Und weil sich viele
damit so ach ??? :-( hä schwer tun, folgen ein paar wichtige Beispiele
aus der Praxis, die jedoch nicht davon befreien die Doku zu lesen. Egon
hat jedoch völlig Recht, wenn er wie aus der Pistole geschossen
schreibt, "quick ref"...

+++ format? +++

string sprintf(string format, mixed [args]... );

(s)printf() benötig mehrerei Parameter. Der erste Parameter (string
format) beschreibt wie die folgenden Parameter dargestellt werden
sollen. Er besteht aus Zeichenkombinationen mit besonderer Bedeutung und
normalem Text. Die Zeichenkombinationen beginnen stets mit einem %. Eine
der einfachsten Zeichenkombinationen (Formatanweisung) ist %s.
%s steht für "gebe den Wert als String aus". 

Welcher Wert ausgegeben werden soll wird printf() als zweiter Parameter
mitgegeben. Ein einfaches Beispiel ist folgendes, welches genau das
gleiche macht wie echo $text:

printf("%s", $text);

printf() ist jedoch nicht auf eine Formatanweisung begrenzt. Es können
beliebig viele benutzt werden. Für jede Formatanweisung muß jedoch auch
ein Wert mitgegeben werden, der an ihrer Stelle eingesetzt werden kann:

printf("%s %s", $text1, $text2);
(sieht aus wie echo "$text1 $text2")

Die erste Formatanweisung wird durch den zweiten Parameter ($text1), die
zweite durch den dritten Parameter ($text2) usw. ersetzt. Für jede
Formatanweisung -muß- ein Wert vorhanden sein. 

Wer nur eine Formatanweisung notiert, darf jedoch noch zwei, drei oder
noch mehr Parameter mitgeben, sie werden lediglich nicht beachtet:

printf("%s", $text1, $text2);
(sieht aus wie ein echo $text1)

+ "Typumwandlung"

Obige Beispiele sind recht simpel. Es soll ein Text ausgegeben werden
und printf() erhält auch bloß Texte als Parameter. printf() kann mehr.
Es kann die Eingangsdaten automatisch in ein anderes Format wechseln.
Z.B. von einer dezimalen zu einer hexadezimalen Zahl. Für die Ausgabe
von heaxdezimalen Zahlen benötigt man %x. 

printf("%x", 255);
(m.W. auch nicht durch die Kombination von echo mit einer weiteren
Funktion möglich)

Mit einer Formatanweisung wie "#%x%x%x" kann man sehr einfach eine Farbe
für einen HTML Tag definieren, ohne mühsam selbst die dezimalen RGB
Werte in ihr hexadezimales Pendant zu wandeln.

printf("#%x%x%x", 255, 0, 0);

Brauchbar ist das Ergebnis "#ff00" leider noch nicht. Weiter unten bei
den Modifiern wird erklärt warum. Zunächst ein weiteres Beispiel: Runden
mit printf(). Es ist weithin bekannt, daß die Zahl pi je nach Kultur und
Zeitpunkt immer wieder andere Werte annahm. Gerüchten zu folge soll in
einigen US Staaten noch vor wenigen Jahrzehnten pi=4 in dicken
Gesetzbüchern definiert worden sein. Vielleicht stimmts, sie rechnen ja
auch mal metrisch, mal....

+ runden 

printf("%f", "emil");           # => 0.000000 (acht Stellen)
printf("%f", "3.14159");        # => 3.141590 (Umwandlung String in
Float)
printf("%1.3f", 3.14159);       # => 3.142 (Rundung)
(echo round(3.14159*1000)/1000) 

Stop - da war etwas neues. Man kann nicht nur %s, %x und %f schreiben,
sondern auch eine Genauigkeit angeben.

+++ Modifiers +++

Modifiers verfeinern die Formatanweisung. So steht "%.2f" für "gebe den
Wert als Float mit zwei Nachkommastellen aus. Zur Ermittlung der
Nachkommastellen runde.".

Statt mühsam mit round() eine Zahl zu runden, schreibt der faule
Programmierer

$pi = sprintf("%.2f", $pi);

.. und vertraut dabei voll auf die Fähigkeit von PHP in den meisten
Fällen korrekt zwischen Typen zu wandeln. Denn eigentlich ist $pi nach
der Zeile ein String, aber man kann ja trotzdem damit rechnen...

Die Anzahl der Stellen vor dem Komma können wir nicht begrenzen. 

printf("%1.2f", 123.456);    # => 123.456
(echo round(123.456*100)/100)

+ ausrichten

Es passiert jedoch etwas anderes, wenn wir "%8.2f" (Preisangaben!)
schreiben. Der Effekt läßt sich im Browser jedoch nur schlecht
beobachten (<pre> nutzen!). Besser ist es php mit der Option -q (kein
Content-type ausgeben) auf der Kommandozeile aufzurufen.

php -q test.php3
mit test.php3:
<?php printf("-%8.2f-", 3.14159); ?>

oder (Win32):
F:\php3>php -q
<?php printf("-%8.2f-", 3.14159); ?>[RETURN]

(mit echo wird es schwierig...)

Die Ausgabe: "-       3.14-" zeigt, daß printf() die Ausgabe mit sieben
Leerzeichen aufgefüllt hat und rechts ausgerichet hat (default). Das ist
eine feine Sache für Tabellen. Jeder der mit C bei seinen ersten
Gehversuchen Primzahlen gesucht hat und auf der Konsole ausgab, wird es
lieben. Und damit sind wir auch wieder bei einem der Vorbilder von PHP.

Natürlich kann man auch eine linksbündige Ausgabe bitten und sogar an
Platz für das Vorzeichen wurde gedacht:

printf("%-8.2f", 3.14159);
(echo round(3.14149*100)/100)

printf("%+8.2f", -3.14159);
printf("%+8.2f", 3.14159); 

+ auffüllen

Was uns für die "Berechnung" von HTML Farbangaben noch fehlt, ist eine
Möglichkeit bei der Wandlung von 0 (dezimal) zu 0 (hexadezimal) auf zwei
Stellen in der hexadezimalen Darstellung zu bestehen, genauer links mit
einem bestimmten Wert aufzufüllen. 0 soll 00 werden, wie das klingt...

printf("#%02x%02x%02x", 255, 0, 0);    # => #ff0000

Jetzt kommt die Transformationsfrage. Geht es bei floats auch? Was macht
folgendes?

printf("%08.2", 3.14159);

Richtig. Es wird 00000255.00 ausgegeben. Links wurde mit 0 aufgefüllt.

+++ Vorbei der Zauber +++

Vieles wurde entzaubert. printf() kann rechnen, formatieren und
umwandeln, es ist oft besser lesbar als ein wildes echo und spart
manchmal Tipparbeit.

printf("select * from %s where id = '%s'",
            $db_table,
            $id
       );

Ein Rätsel bleibt. Wie gibt man ein Prozentzeichen aus? Dafür drückt man
unter php.net den Button "quick ref", sucht nach sprintf und liest!

Ulf


php::bar PHP Wiki   -   Listenarchive