Mailinglisten-Archive |
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