Be careful:
printf ("(9.95 * 100) = %d \n", (9.95 * 100));
'994'
First %d converts a float to an int by truncation.
Second floats are notorious for tiny little rounding errors.
(PHP 4, PHP 5, PHP 7, PHP 8)
printf — Liefert einen formatierten String
Erzeugt eine Ausgabe abhängig von format
.
format
Der Formatstring setzt sich aus keiner oder mehreren Anweisungen
zusammen: Normale Zeichen (abgesehen von %
),
die direkt in das Ergebnis kopiert werden und
Konvertierungsanweisungen, die jeweils ihre
eigenen Parameter abrufen.
Eine Konvertierungsanweisung folgt diesem Prototypen:
%[ArgNum$][Flags][Weite][.Präzision]Spezifizierer
.
Eine Ganzzahl gefolgt von einem Dollarzeichen $
, die die
Nummer des Arguments angibt, das für die Konversion verwendet werden soll.
Flag | Beschreibung |
---|---|
- |
Linksbündig innerhalb der angegebenen Feldbreite; Rechtsbündig ist der Standard |
+ |
Positive Zahlen mit einem Pluszeichen
+ ; Standardmäßig werden nur negative
Zahlen mit negativen Vorzeichen ausgegeben
|
(Leerzeichen) |
Füllt das Ergebnis mit Leerzeichen auf. Dies ist der Standard. |
0 |
Füllt nach Links mit Nullen auf.
Mit dem s -Spezifizierer
kann dies auch nach rechts mit Nullen auffüllen.
|
' (Zeichen) |
Füllt das Ergebnis mit dem angegebenen Zeichen auf. |
Entweder eine Ganzzahl die angibt, wie viele Zeichen (Minimum) das
Konvertierungsergebnis haben soll oder *
. Wenn
*
verwendet wird, wird die Breite als zusätzlicher
ganzzahliger Wert angegeben, der bestimmt, wie viele Zeichen vor dem durch
den Spezifizierer formatierten Wert stehen sollen.
Ein Punkt .
, optional gefolgt von einer Ganzzahl oder
*
, dessen Bedeutung vom Spezifizierer abhängt:
e
, E
,
f
und F
: Dies stellt die
Anzahl der Nachkommastellen an, die nach dem Dezimaltrennzeichen
ausgegeben werden soll (Standardmäßig ist dies 6).
g
, G
,
h
und H
:
Die maximale Anzahl der auszugebenenden signifikanten
Nachkommastellen.
s
Spezifizierer: Verhält sich wie ein
Abschneidepunkt, der eine maximale Anzahl an Zeichen in der
Zeichenkette angibt.
Hinweis: Wenn der Punkt ohne einen expliziten Wert für die Genauigkeit angegeben wird, wird 0 angenommen. Wenn
*
verwendet wird, wird die Genauigkeit als zusätzliche Ganzzahl vor dem durch den Bezeichner formatierten Wert angegeben.
Spezifizierer | Beschreibung |
---|---|
% |
Ein Prozentzeichen. Kein Parameter nötig. |
b |
Der Parameter wird als Ganzzahl behandelt und als Binärzahl ausgegeben. |
c |
Der Parameter wird als Ganzzahl behandelt und als Zeichen aus dem ASCII-Zeichensatz ausgegeben. |
d |
Der Parameter wird als Ganzzahl behandelt und als (vorzeichenbehaftete) Dezimalzahl ausgegeben. |
e |
Der Parameter wird als Zahl in wissenschaftlicher Schreibweise (z. B. 1.2e+2) behandelt. |
E |
Wie der Spezifizierer e , aber schreibt
einen Großbuchstaben (z. B. 1.2E+2).
|
f |
Der Parameter wird als Gleitkommazahl betrachtet und als Gleitkommazahl ausgegeben (abhängig von der Locale). |
F |
Der Parameter wird als Gleitkommazahl betrachtet und als Gleitkommazahl (unabhängig von der Locale) ausgegeben. |
g |
Generelles Format. Sei P gleich der Genauigkeit, wenn nicht Null, 6, wenn die Genauigkeit nicht angegeben ist, oder 1 wenn die Genauigkeit Null ist. Dann, wenn eine Konvertierung mittels E einen Exponenten von X hätte: Wenn P > X ≥ −4, erfolgt die Konvertierung mit Spezifizierer f und Genauigkeit P - (X + 1), andernfalls mit Spezifizierer e und Genauigkeit P - 1. |
G |
Wie der Spezifizierer g , aber
es wird E und f verwendet.
|
h |
Wie der Spezifizierer g , aber es werden
F verwendet. Verfügbar ab PHP 8.0.0.
|
H |
Wie der Spezifizierer g , aber es werden
E und F verwendet. Verfügbar ab
PHP 8.0.0.
|
o |
Der Parameter wird als Ganzzahl betrachtet und als Oktalzahl ausgegeben. |
s |
Der Parameter wird als Zeichenkette betrachtet und ausgegeben. |
u |
Der Parameter wird als Ganzzahl betrachtet und als vorzeichenlose Dezimalzahl ausgegeben. |
x |
Der Parameter wird als Ganzzahl betrachtet und als Hexadezimalzahl (mit Kleinbuchstaben) ausgegeben. |
X |
Der Parameter wird als Ganzzahl betrachtet und als Hexadezimalzahl (mit Großbuchstaben) ausgegeben. |
Der Spezifizierer c
ignoriert Auffüllung und Weite.
Der Versuch, die Kombination aus Zeichenketten mit Weite-Spezifizierern und Zeichensätzen die mehr als ein Byte pro zeichen erwarten zu verwenden, führt zu unvorhersehbaren Ergebnissen.
Variablen werden auf einen für den Spezifizier passenden Typen umgewandelt:
Typ | Spezifizierer |
---|---|
string | s |
int |
d ,
u ,
c ,
o ,
x ,
X ,
b
|
float |
e ,
E ,
f ,
F ,
g ,
G ,
h ,
H
|
values
Gibt die Länge des ausgegebenen Strings zurück.
Wenn die Anzahl der Argumente Null ist, wird seit PHP 8.0.0 ein ValueError ausgelöst.
Vor PHP 8.0.0 wurde stattdessen eine E_WARNING
ausgegeben.
Wenn [width]
kleiner als Null oder größer als PHP_INT_MAX
ist, wird seit PHP 8.0.0 ein ValueError ausgelöst.
Vor PHP 8.0.0 wurde stattdessen eine E_WARNING
ausgegeben.
Wenn [precision]
kleiner als Null oder größer als PHP_INT_MAX
ist, wird seit PHP 8.0.0 ein ValueError ausgelöst.
Vor PHP 8.0.0 wurde stattdessen eine E_WARNING
ausgegeben.
Wenn weniger Argumente angegeben werden als nötig, wird seit PHP 8.0.0 ein ArgumentCountError ausgelöst.
Vor PHP 8.0.0 wurde stattdessen false
zurückgegeben und eine E_WARNING
ausgegeben.
Version | Beschreibung |
---|---|
8.0.0 |
Diese Funktion gibt bei Auftreten eines Fehlers nicht mehr false
zurück.
|
8.0.0 |
Wenn die Anzahl der Argumente Null ist, löst diese Funktion einen
ValueError aus; vorher gab sie stattdessen eine
E_WARNING aus.
|
8.0.0 |
Wenn [width] kleiner als Null oder größer als
PHP_INT_MAX ist, löst diese Funktion einen
ValueError aus; vorher gab sie stattdessen einen
E_WARNING aus.
|
8.0.0 |
Wenn [precision] kleiner als Null oder größer als
PHP_INT_MAX ist, löst diese Funktion einen
ValueError aus; vorher gab sie stattdessen eine
E_WARNING aus.
|
8.0.0 |
Wenn weniger Argumente angegeben werden als nötig, löst diese Funktion
einen ArgumentCountError aus; vorher gab sie
stattdessen eine E_WARNING aus.
|
Beispiel #1 printf(): Verschiedene Beispiele
<?php
$n = 43951789;
$u = -43951789;
$c = 65; // ASCII 65 is 'A'
// Beachten Sie das doppelte %%, dies gibt ein '%'-Zeichen aus
printf("%%b = '%b'\n", $n); // Binärdarstellung
printf("%%c = '%c'\n", $c); // Ausgabe des ASCII-Zeichens; gleicht der chr() Funktion
printf("%%d = '%d'\n", $n); // Standard-Integerdarstellung
printf("%%e = '%e'\n", $n); // Wissenschaftliche Notation
printf("%%u = '%u'\n", $n); // vorzeichenlose Integerdarstellung einer positiven Zahl
printf("%%u = '%u'\n", $u); // vorzeichenlose Integerdarstellung einer negativen Zahl
printf("%%f = '%f'\n", $n); // Fließkommazahldarstellung
printf("%%o = '%o'\n", $n); // Oktaldarstellung
printf("%%s = '%s'\n", $n); // Stringdarstellung
printf("%%x = '%x'\n", $n); // Hexadezimaldarstellung (Kleinbuchstaben)
printf("%%X = '%X'\n", $n); // Hexadezimaldarstellung (Großbuchstaben)
printf("%%+d = '%+d'\n", $n); // Vorzeichenangabe für positive Integerzahlen
printf("%%+d = '%+d'\n", $u); // Vorzeichenangabe für negative Integerzahlen
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
%b = '10100111101010011010101101' %c = 'A' %d = '43951789' %e = '4.39518e+7' %u = '43951789' %u = '4251015507' %f = '43951789.000000' %o = '247523255' %s = '43951789' %x = '29ea6ad' %X = '29EA6AD' %+d = '+43951789' %+d = '-43951789'
Beispiel #2 printf(): Stringformatierung
<?php
$s = 'monkey';
$t = 'many monkeys';
printf("[%s]\n", $s); // normale rechtsbündige Ausgabe
printf("[%10s]\n", $s); // rechtsbündige Ausgabe, mit Leerzeichen aufgefüllt
printf("[%-10s]\n", $s); // linksbündige Ausgabe, mit Leerzeichen aufgefüllt
printf("[%010s]\n", $s); // auffüllen mit Nullen funktioniert auch bei Strings
printf("[%'#10s]\n", $s); // Verwendung des benutzerdefinierten Auffüllzeichens '#'
printf("[%'#*s]\n", 10, $s); // Angabe der Auffüllbreite durch ein zusätzliches Argument
printf("[%10.9s]\n", $t); // rechtsbündige Ausgabe mit Abschneiden überflüssiger
// Buchstaben nach der achten Stelle
printf("[%-10.9s]\n", $t); // linksbündige Ausgabe mit Abschneiden überflüssiger
// Buchstaben nach der achten Stelle
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
[monkey] [ monkey] [monkey ] [0000monkey] [####monkey] [ many monk] [many monk ]
Be careful:
printf ("(9.95 * 100) = %d \n", (9.95 * 100));
'994'
First %d converts a float to an int by truncation.
Second floats are notorious for tiny little rounding errors.
[Editor's Note: Or just use vprintf...]
If you want to do something like <?php printf('There is a difference between %s and %s', array('good', 'evil')); ?> (this doesn't work) instead of <?php printf('There is a difference between %s and %s', 'good', 'evil'); ?> you can use this function:
<?php
function printf_array($format, $arr)
{
return call_user_func_array('printf', array_merge((array)$format, $arr));
}
?>
Use it the following way:
<?php
$goodevil = array('good', 'evil');
printf_array('There is a difference between %s and %s', $goodevil);
?>
and it will print:
There is a difference between good and evil
You can use this function to format the decimal places in a number:
$num = 2.12;
printf("%.1f",$num);
prints:
2.1
see also: number_format()
A few things to note about printf:
1. The definition of specifier g (or G) is often wrongly stated as being "use e or f (or E or f), whichever results in the shorter string". The correct rule is given in the documentation and it does not always give this result.
2. For g/G/h/H, trailing zeros after the decimal point are removed (but not a zero just after the decimal point, in the e/E style).
3. g/G are locale-aware whether the e/E or f style is produced.
4. For b/o/x/X/u (that is, all integer styles except d) the result shown for negative values is the twos complement form of the number, 2**32 + v, where v is the (negative) value.