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 — Affiche une chaîne de caractères formatée
Affiche une chaîne de caractères formatée.
format
La chaîne de format est composé de zéro ou plusieurs directives :
des caractères ordinaires (à l'exception de %
)
qui sont copiés directement dans le résultat et des
spécifications de conversion,
chacun ayant pour résultat de récupérer ses propres paramètre.
Une spécification de conversion qui suit ce prototype :
%[argnum$][flags][width][.precision]specifier
.
Un entier suivit d'un signe dollar $
,
pour spécifier quel numéro d'argument à traiter dans la conversion.
Drapeau | Description |
---|---|
- |
Justifie le texte à gauche donnée la largeur du champ ; Justification à droite est le comportement par défaut. |
+ |
Préfixe les nombres positives avec un signe plus
+ ; Par défaut seul les nombres
négatifs sont préfixés avec un signe négatif.
|
(espace) |
Complète le résultat avec des espaces. Ceci est par défaut. |
0 |
Complète uniquement les nombres à gauches avec des zéros.
Avec le spécificateur s ceci peut aussi
compléter à droite avec des zéros.
|
' (char) |
Complète le résultat avec le caractère (char). |
Soit un entier indiquant le nombre de caractères (minimum)
que cette conversion doit produire, soit *
.
Si *
est utilisé, alors la largeur est fournie
en tant que valeur entière supplémentaire précédant celle formatée
par le spécificateur.
Un point .
suivi optionnellement
soit d'un entier, soit de *
,
dont la signification dépend du spécificateur :
e
, E
,
f
et F
:
ceci est le nombre de chiffres à afficher après
la virgule (par défaut, ceci est 6).
g
, G
,
h
et H
:
ceci est le nombre maximal de chiffres significatifs à afficher.
digits to be printed.
s
: il agit comme un point de coupure,
définissant une limite maximale de caractères de la chaîne.
Note: Si le point est spécifié sans une valeur explicite pour la précision, 0 est assumé. Si
*
est utilisé, la précision est fournie en tant que valeur entière supplémentaire précédant celle formatée par le spécificateur.
Spécificateur | Description |
---|---|
% |
Un caractère de pourcentage littéral. Aucun argument n'est nécessaire. |
b |
L'argument est traité comme un entier et présenté comme un nombre binaire. |
c |
L'argument est traité comme un entier et présenté comme le caractère de code ASCII correspondant. |
d |
L'argument est traité comme un entier et présenté comme un nombre entier décimal (signé). |
e |
L'argument est traité comme une notation scientifique
(e.g. 1.2e+2 ).
|
E |
Comme le spécificateur e mais utilise
une lettre majuscule (par exemple 1.2E+2).
|
f |
L'argument est traité comme un nombre à virgule flottante (type nombre décimal) et présenté comme un nombre à virgule flottante (tenant compte de la locale utilisée). |
F |
L'argument est traité comme un nombre à virgule flottante (type nombre décimal) et présenté comme un nombre à virgule flottante (ne tenant pas compte de la locale utilisée). |
g |
Format général. Soit P égal à la précision si différent de 0, 6 si la précision est omit ou 1 si la précision est zéro. Alors, si la conversion avec le style E aurait comme exposant X : Si P > X ≥ −4, la conversion est avec style f et précision P − (X + 1). Sinon, la conversion est avec le style e et précision P - 1. |
G |
Comme le spécificateur g mais utilise
E et f .
|
h |
Comme le spécificateur g mais utilise F .
Disponible à partir de PHP 8.0.0.
|
H |
Comme le spécificateur g mais utilise
E et F . Disponible à partir de PHP 8.0.0.
|
o |
L'argument est traité comme un entier et présenté comme un nombre octal. |
s |
L'argument est traité et présenté comme une chaîne de caractères. |
u |
L'argument est traité comme un entier et présenté comme un nombre décimal non signé. |
x |
L'argument est traité comme un entier et présenté comme un nombre hexadécimal (les lettres en minuscules). |
X |
L'argument est traité comme un entier et présenté comme un nombre hexadécimal (les lettres en majuscules). |
Le spécificateur de type c
ignore l'alignement et la taille.
Le fait de tenter d'utiliser une combinaison d'une chaîne et de spécificateurs avec des jeux de caractères qui nécessitent plus d'un octet par caractères donnera un résultat inattendu.
Les variables seront contraints à un type approprié pour le spécificateur :
Type | Spécificateurs |
---|---|
string | s |
int |
d ,
u ,
c ,
o ,
x ,
X ,
b
|
float |
e ,
E ,
f ,
F ,
g ,
G ,
h ,
H
|
values
Retourne la taille de la chaîne affichée.
À partir de PHP 8.0.0, une ValueError est lancée si le nombre d'arguments est nul.
Antérieur à PHP 8.0.0, un E_WARNING
était émis à la place.
À partir de PHP 8.0.0, une ValueError est lancée si [width]
est inférieur à zéro ou supérieur à PHP_INT_MAX
.
Antérieur à PHP 8.0.0, un E_WARNING
était émis à la place.
À partir de PHP 8.0.0, une ValueError est lancée si [precision]
est inférieur à zéro ou supérieur à PHP_INT_MAX
.
Antérieur à PHP 8.0.0, un E_WARNING
était émis à la place.
À partir de PHP 8.0.0, une ArgumentCountError est lancée lorsque moins d'arguments sont donnés que requis.
Antérieur à PHP 8.0.0, false
était retourné et un E_WARNING
était émis à la place.
Version | Description |
---|---|
8.0.0 |
Cette fonction ne renvoie plus false en cas d'échec.
|
8.0.0 |
Lance une ValueError si le nombre d'arguments est zéro ;
auparavant, cette fonction émettait un E_WARNING .
|
8.0.0 |
Lance une ValueError si [width] est inférieur à zéro ou supérieur à PHP_INT_MAX ;
auparavant, cette fonction émettait un E_WARNING .
|
8.0.0 |
Lance une ValueError si [precision] est inférieur à zéro ou supérieur à PHP_INT_MAX ;
auparavant, cette fonction émettait un E_WARNING .
|
8.0.0 |
Lance une ArgumentCountError lorsque moins d'arguments sont donnés que requis ;
auparavant, cette fonction émettait un E_WARNING .
|
Exemple #1 printf() : divers exemples
<?php
$n = 43951789;
$u = -43951789;
$c = 65; // ASCII 65 is 'A'
// notez le double %%, cela affiche un caractère '%' littéral
printf("%%b = '%b'\n", $n); // représentation binaire
printf("%%c = '%c'\n", $c); // affiche le caractère ascii, comme la fonction chr()
printf("%%d = '%d'\n", $n); // représentation standard d'un entier
printf("%%e = '%e'\n", $n); // notation scientifique
printf("%%u = '%u'\n", $n); // représentation entière non signée d'un entier positif
printf("%%u = '%u'\n", $u); // représentation entière non signée d'un entier négatif
printf("%%f = '%f'\n", $n); // représentation en virgule flottante
printf("%%o = '%o'\n", $n); // représentation octale
printf("%%s = '%s'\n", $n); // représentation chaîne de caractères
printf("%%x = '%x'\n", $n); // représentation hexadécimal (minuscule)
printf("%%X = '%X'\n", $n); // représentation hexadécimal (majuscule)
printf("%%+d = '%+d'\n", $n); // indication du signe pour un entier positif
printf("%%+d = '%+d'\n", $u); // indication du signe pour un entier négatif
?>
L'exemple ci-dessus va afficher :
%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'
Exemple #2 printf() : spécificateurs chaînes de caractères
<?php
$s = 'monkey';
$t = 'many monkeys';
printf("[%s]\n", $s); // affichage d'une chaîne standard
printf("[%10s]\n", $s); // justification à droite avec des espaces
printf("[%-10s]\n", $s); // justification à gauche avec des espaces
printf("[%010s]\n", $s); // l'espacement nul fonctionne aussi sur les chaînes
printf("[%'#10s]\n", $s); // utilisation du caractère personnalisé de séparation '#'
printf("[%'#*s]\n", 10, $s); // Fournir la largeur de la justification comme argument supplémentaire
printf("[%10.9s]\n", $t); // justification à droite mais avec une coupure à 8 caractères
printf("[%-10.9s]\n", $t); // justification à gauche mais avec une coupure à 8 caractères
?>
L'exemple ci-dessus va afficher :
[monkey] [ monkey] [monkey ] [0000monkey] [####monkey] [####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
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.
To provide a more user-friendly interface, you can use colors when printing text in the terminal.
p('Ordinary text.');
p('Warning: Check this out...', 'info');
p('Ops! Something went wrong.', 'error');
p('Yeah... done!', 'success');
function p($text, $style = '', $newLine = true) {
$styles = array(
'success' => "\033[0;32m%s\033[0m",
'error' => "\033[31;31m%s\033[0m",
'info' => "\033[33;33m%s\033[0m",
'Black' => "\033[0;30m%s\033[0m",
'Red' => "\033[0;31m%s\033[0m",
'Green' => "\033[0;32m%s\033[0m",
'Yellow' => "\033[0;33m%s\033[0m",
'Blue' => "\033[0;34m%s\033[0m",
'Purple' => "\033[0;35m%s\033[0m",
'Cyan' => "\033[0;36m%s\033[0m",
'Gray' => "\033[0;37m%s\033[0m",
'Graphite' => "\033[1;30m%s\033[0m",
'Bold Red' => "\033[1;31m%s\033[0m",
'Bold Green' => "\033[1;32m%s\033[0m",
'Bold Yellow' => "\033[1;33m%s\033[0m",
'Bold Blue' => "\033[1;34m%s\033[0m",
'Bold Purple' => "\033[1;35m%s\033[0m",
'Bold Cyan' => "\033[1;36m%s\033[0m",
'Bold White' => "\033[1;37m%s\033[0m",
'Bg Black' => "\033[40;1;37m%s\033[0m",
'Bg Red' => "\033[41;1;37m%s\033[0m",
'Bg Green' => "\033[42;1;37m%s\033[0m",
'Bg Yellow' => "\033[43;1;37m%s\033[0m",
'Bg Blue' => "\033[44;1;37m%s\033[0m",
'Bg Purple' => "\033[45;1;37m%s\033[0m",
'Bg Cyan' => "\033[46;1;37m%s\033[0m",
'Bg Gray' => "\033[47;1;37m%s\033[0m",
'Underscore' => "\033[4;37m%s\033[0m",
'Inverted' => "\033[7;37m%s\033[0m",
'Blink' => "\033[5;37m%s\033[0m",
);
$format = '%s';
if (isset($styles[$style])) {
$format = $styles[$style];
}
if ($newLine) {
$format .= PHP_EOL;
}
printf($format, $text);
}
instead of writing a function to round off a float (let's call it 'x') accurately, it's much easier to add a small number to x and then truncate it...
For example: if you want to round off to the nearest integer, just add 0.5 to x and then truncate it. if x=12.6, then it would calculate 13.1, and truncate it to 13. If x=14.4, it would calculate 14.9 and truncate it to 14.
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()
To format a dollar value as in $123.00 that may otherwise look like $123 use this
print ('$'); // the dollar sign in front of our answer
printf ('%.2f',$price);