sprintf() renvoie une chaîne construite à partir d'un format et d'une liste de valeurs : chaque marqueur % du format est remplacé par la valeur suivante. sprintf('%s is %d years old', 'Ada', 36) renvoie "Ada is 36 years old". printf() prend les mêmes arguments mais affiche le résultat au lieu de le renvoyer.
Les marqueurs sont remplis dans l'ordre, de gauche à droite. %.2f affiche toujours deux décimales (4.50, pas 4.5), et %05d complète le nombre avec des zéros jusqu'à cinq chiffres.
Les spécificateurs de format
Un marqueur s'écrit %, des modificateurs facultatifs, puis une lettre pour le type :
| Spécificateur | Signification | sprintf(...) | Résultat |
|---|---|---|---|
%s | chaîne | sprintf('%s', 'PHP') | PHP |
%d | entier (signé) | sprintf('%d', 42.9) | 42 |
%f | float, 6 décimales par défaut | sprintf('%f', 1.5) | 1.500000 |
%.2f | float, 2 décimales | sprintf('%.2f', 1.5) | 1.50 |
%e | notation scientifique | sprintf('%e', 1234.5678) | 1.234568e+3 |
%x / %X | hexadécimal | sprintf('%x', 255) | ff |
%o | octal | sprintf('%o', 8) | 10 |
%b | binaire | sprintf('%b', 5) | 101 |
%c | caractère à partir d'un code | sprintf('%c', 65) | A |
%u | entier non signé | sprintf('%u', 3) | 3 |
%% | un signe pourcentage littéral | sprintf('%d%%', 50) | 50% |
Modifiez les valeurs ci-dessous et relancez :
%d tronque un float vers zéro, donc 42.9 devient 42. Si vous voulez 43, arrondissez d'abord : sprintf('%d', round(42.9)). Une chaîne qui n'est pas un nombre, comme 'abc', devient 0 avec %d.
Compléter avec des zéros devant
Entre % et la lettre, vous pouvez placer un caractère de remplissage et une largeur. %05d signifie « compléter avec 0 jusqu'à une largeur de 5 ». C'est la façon habituelle de formater des numéros de commande, des numéros de facture, des heures et des dates.
La largeur est un minimum. Un nombre plus long que la largeur est affiché en entier.
%05.2f : largeur et décimales ensemble
Avec les floats, la largeur compte chaque caractère du résultat, y compris le point décimal et le signe moins. C'est pourquoi %05.2f sur 3.14159 donne 03.14 : cinq caractères au total, dont deux après le point.
%f utilise le séparateur décimal de la locale courante (définie avec setlocale()), alors que %F utilise toujours un point. Si votre code définit une locale et qu'il vous faut un point pour du JSON, du CSV ou une API, utilisez %F.
Aligner du texte en colonnes
Une largeur positive aligne à droite, un - avant la largeur aligne à gauche, et ' suivi d'un caractère définit un caractère de remplissage personnalisé. Combinés, ils alignent des rapports en texte brut et des tickets de caisse.
%-14s complète le nom de l'article à droite jusqu'à 14 caractères, %8.2f aligne le prix à droite sur 8 caractères, et %'-27s avec une chaîne vide affiche une ligne de 27 tirets. %'*10s remplit avec * au lieu d'espaces.
Numéroter les arguments pour les réutiliser ou les réordonner
%1$s signifie « le premier argument en tant que chaîne », %2$d « le second en tant qu'entier ». Les marqueurs numérotés permettent d'utiliser une valeur deux fois ou de changer l'ordre sans changer la liste d'arguments, ce dont les traducteurs ont besoin quand l'ordre des mots diffère d'une langue à l'autre.
vsprintf, printf et les valeurs de retour
vsprintf() prend les valeurs sous forme d'un seul tableau, pratique quand elles sont déjà dans un tableau. printf() renvoie le nombre d'octets affichés, et vprintf() est la version tableau de printf().
Le compte renvoyé par printf() inclut le saut de ligne, donc "Hello\n" fait 6 octets. Pour du texte multioctet, il compte des octets, pas des caractères.
Trop peu d'arguments lève une erreur
Depuis PHP 8, un format avec plus de marqueurs que de valeurs lève une ArgumentCountError au lieu de renvoyer false. Comptez les marqueurs % (en ignorant %%) quand vous voyez cette erreur.
Le message compte la chaîne de format comme un argument : ArgumentCountError: 4 arguments are required, 3 given. Les arguments en trop sont ignorés sans bruit, donc l'erreur inverse ne se voit pas. Si un résultat de sprintf semble faux, affichez le format à côté des valeurs. Quand vous avez seulement besoin d'un séparateur de milliers, number_format() est plus simple que d'en construire un avec sprintf. La liste complète des modificateurs est sur php.net.
Questions fréquentes
Comment ajouter des zéros devant un nombre en PHP ?
Utilisez sprintf('%05d', 42), qui renvoie "00042". Le 0 est le caractère de remplissage et 5 la largeur totale. Pour une chaîne, str_pad('42', 5, '0', STR_PAD_LEFT) donne le même résultat.
Comment formater un nombre avec 2 décimales avec sprintf ?
Utilisez %.2f : sprintf('%.2f', 3.14159) renvoie "3.14" et sprintf('%.2f', 5) renvoie "5.00". Ajoutez une largeur pour remplir aussi : %08.2f donne "00003.14".
Quelle est la différence entre printf et sprintf en PHP ?
sprintf() renvoie la chaîne formatée pour que vous puissiez la stocker. printf() l'affiche immédiatement et renvoie le nombre d'octets affichés. echo sprintf(...) et printf(...) produisent le même affichage.
Que signifie %s en PHP ?
%s est un marqueur pour une chaîne dans sprintf() et printf() : sprintf('Hello, %s', 'Ada') renvoie "Hello, Ada". Les nombres passés à %s sont convertis en chaînes. %d sert aux entiers et %f aux floats.
Comment utiliser deux fois le même argument dans sprintf ?
Numérotez les marqueurs : sprintf('%1$s loves %2$s, and %2$s loves %1$s', 'Ada', 'PHP'). Mettez le format entre guillemets simples : entre guillemets doubles, PHP lit $s comme une variable, donc "%1$s" devient %1 suivi de la valeur de $s.