sprintf en PHP : formater des chaînes avec précision

Tu veux insérer des variables dans un texte avec un format précis ? La fonction sprintf en PHP te permet de créer des chaînes formatées proprement. Tu peux aligner des nombres, ajouter des zéros devant, ou réorganiser tes variables facilement.

Cette fonction existe depuis PHP 4. Elle fonctionne dans toutes les versions modernes du langage.

Signature de la fonction

sprintf(string $format, mixed ...$valeurs): string

Explication des paramètres :

  • $format (obligatoire) : ta chaîne avec des marqueurs de position (ex. %s, %d, %f).
  • $valeurs (optionnel) : les valeurs à insérer dans l’ordre des marqueurs.

Principaux marqueurs :

  • %s : chaîne de caractères (string).
  • %d : nombre entier (integer).
  • %f : nombre à virgule flottante (float).
  • %x : nombre hexadécimal.

Directives de formatage

Les directives contrôlent comment sprintf() affiche tes valeurs. Chaque directive commence par % suivi de caractères spécifiques.

Structure d’une directive complète

%[argument][signe][padding][largeur][.précision]type

Types de base (obligatoires)

TypeDescriptionExemple
%sChaîne de caractèressprintf("%s", "Bonjour") → « Bonjour »
%dNombre entiersprintf("%d", 42) → « 42 »
%fNombre décimalsprintf("%f", 3.14) → « 3.140000 »
%xHexadécimal minusculesprintf("%x", 255) → « ff »
%XHexadécimal majusculesprintf("%X", 255) → « FF »
%bBinairesprintf("%b", 5) → « 101 »
%oOctalsprintf("%o", 8) → « 10 »
%%Caractère % littéralsprintf("50%%") → « 50% »

Précision (décimales)

La notation .X définit le nombre de décimales.

sprintf("%.2f", 3.14159);     // "3.14"
sprintf("%.0f", 3.14159);     // "3"
sprintf("%.4f", 3.1);         // "3.1000"

Largeur (espacement)

Le nombre définit la largeur minimale de la chaîne.

sprintf("%5d", 42);           // "   42" (complète avec espaces)
sprintf("%10s", "test");      // "      test"

Padding (remplissage)

Le caractère 0 remplit avec des zéros au lieu d’espaces.

sprintf("%05d", 42);          // "00042"
sprintf("%08.2f", 3.1);       // "00003.10"

Alignement

Le signe - aligne à gauche au lieu de droite.

sprintf("%-10s", "test");     // "test      "
sprintf("%-5d", 42);          // "42   "

Signe explicite

Le caractère + affiche toujours le signe.

sprintf("%+d", 42);           // "+42"
sprintf("%+d", -42);          // "-42"

Ordre des arguments

%2$ permet de réorganiser les variables.

sprintf("%2$s a %1$d ans", 25, "Marie");
// "Marie a 25 ans"

Exemples combinés

// Padding + précision
sprintf("%08.2f", 3.5);       // "00003.50"

// Largeur + alignement
sprintf("%-15s : %5d", "Total", 42);
// "Total           :    42"

// Signe + padding
sprintf("%+05d", 7);          // "+0007"

Exemples pour la fonction sprintf en PHP

Exemple 1 : Usage basique

$nom = "Marie";
$age = 28;
echo sprintf("Bonjour %s, tu as %d ans.", $nom, $age);
// "Bonjour Marie, tu as 28 ans."

Exemple 2 : Formatage de nombres

$prix = 19.5;
echo sprintf("Prix : %.2f €", $prix);
// "Prix : 19.50 €"

$nombre = 7;
echo sprintf("Numéro : %03d", $nombre);
// "Numéro : 007" (complète avec des zéros)

Exemple 3 : Réorganiser les arguments

$quantite = 12;
$produit = "pommes";
echo sprintf("Le %2$s contient %1$d %2$s.", $quantite, $produit);
// "Le pommes contient 12 pommes."

Exemple 4 : Cas réels

Générer code promo formaté :

$id = 42;
echo sprintf("PROMO-%05d", $id);
// "PROMO-00042"

Message de log structuré :

$user = "admin";
$action = "suppression";
$timestamp = time();
$log = sprintf("[%d] %s a effectué : %s", $timestamp, $user, $action);
// "[1736486400] admin a effectué : suppression"

Exemple 5 : Alignement des colonnes

$produits = [
    ['Pomme', 2.50],
    ['Banane', 1.20],
    ['Orange', 3.00]
];
foreach ($produits as [$nom, $prix]) {
    echo sprintf("%-10s %6.2f €\n", $nom, $prix);
}
// "Pomme       2.50 €"
// "Banane      1.20 €"
// "Orange      3.00 €"

Cas d’usage pratiques

  • Codes produits : sprintf("SKU-%06d", $id) génère SKU-000042.
  • Messages templates : créer des emails ou logs structurés.
  • Formatage prix : toujours 2 décimales avec %.2f.
  • Tableaux CLI : aligner des colonnes de données.
  • Requêtes SQL : construire des valeurs formatées (avec échappement).

Bonnes pratiques / pièges

1. Différence sprintf() vs printf() vs vsprintf()

Point clé : ces trois fonctions utilisent les mêmes directives mais diffèrent par leur sortie.

FonctionComportementCas d’usage
sprintf()Retourne la chaîneStocker, manipuler, assigner
printf()Affiche directementEcho rapide, CLI, logs
vsprintf()Accepte tableau argumentsArguments dynamiques
// sprintf : stocke
$message = sprintf("Total : %d €", 50);
echo $message;  // "Total : 50 €"

// printf : affiche directement
printf("Total : %d €", 50);  // Affiche "Total : 50 €"

// vsprintf : arguments en tableau
$format = "Nom : %s, Age : %d";
$args = ["Marie", 28];
echo vsprintf($format, $args);  // "Nom : Marie, Age : 28"

2. Gestion des caractères spéciaux et encodage

Point clé : sprintf() ne gère pas l’encodage UTF-8 automatiquement.

Largeur avec caractères multibytes

$nom = "François";  // 8 caractères, mais "ç" = 2 octets UTF-8

sprintf("%10s", $nom);  // "  François" (compte 9 octets, pas 8 caractères)
// Résultat visuel décalé !

// ✅ Solution : mb_strlen pour calculer
$largeur = 10 - mb_strlen($nom, 'UTF-8');
sprintf("%{$largeur}s%s", "", $nom);

Caractères spéciaux dans format





// ❌ Guillemets doubles = interpolation
$var = "test";
sprintf("Valeur : %s", $var);  // OK

// ⚠️ Variables dans format
$format = "Total : %d";
sprintf($format, 50);  // OK mais attention aux injections

// ✅ Format littéral sécurisé
sprintf('Total : %d', 50);  // Guillemets simples = pas d'interpolation

3. Comportement avec arguments manquants ou en excès

Point clé : PHP 8.0+ est strict sur le nombre d’arguments.

Arguments manquants

// PHP 7.x : Warning
sprintf("Nom : %s, Age : %d", "Jean");  
// Warning + affichage partiel

// PHP 8.0+ : ValueError (erreur fatale)
sprintf("Nom : %s, Age : %d", "Jean");  
// ValueError: 2 format specifiers, 1 argument

Arguments en excès

// ✅ Ignorés sans erreur
sprintf("Nom : %s", "Jean", 35, "Paris");  
// "Nom : Jean" (35 et "Paris" ignorés)

Gestion sécurisée

// ❌ Risqué
$format = $_GET['format'];  // Contrôlé par utilisateur
sprintf($format, $data);

// ✅ Format fixe
$formats = [
    'simple' => "Nom : %s",
    'complet' => "Nom : %s, Age : %d"
];
sprintf($formats[$_GET['type']], $nom, $age);

4. BONUS : Compatibilité avec types stricts





phpdeclare(strict_types=1);

function afficher(int $nombre): string {
    return sprintf("%d", $nombre);
}

afficher(42);      // ✅ "42"
afficher("42");    // ❌ TypeError en mode strict
afficher(3.14);    // ❌ TypeError en mode strict

// sprintf force la conversion APRÈS le type hint

Piège 1 : Nombre d’arguments incorrect

// ❌ Erreur : 2 marqueurs, 1 valeur
echo sprintf("Nom : %s, Age : %d", "Jean");
// ValueError en PHP 8.0+

// ✅ Arguments complets
echo sprintf("Nom : %s, Age : %d", "Jean", 35);

Piège 2 : Type incompatible

$texte = "abc";
echo sprintf("Nombre : %d", $texte);
// "Nombre : 0" (conversion forcée)

// ✅ Utilise le bon marqueur
echo sprintf("Texte : %s", $texte);

Piège 3 : Sécurité et injection

// ❌ Risque injection
$input = $_GET['nom'];
$sql = sprintf("SELECT * FROM users WHERE nom = '%s'", $input);

// ✅ Utilise prepared statements
$stmt = $pdo->prepare("SELECT * FROM users WHERE nom = ?");
$stmt->execute([$input]);

Performance et limites

Points forts :

  • Lisibilité : format clair pour messages complexes.
  • Précision : contrôle total sur formatage nombres/textes.
  • Réutilisable : templates stockables en base/config.

Limites :

  • Plus lent que la concaténation simple (2-3x).
  • Complexité : marqueurs avancés (%'x9d) peu intuitifs.
  • PHP 8.0+ : erreurs strictes si arguments manquants.
  • Gros volumes : sur 100 000+ appels, perte notable vs concat

Alternatives

BesoinFonction
Affichage directprintf()
Formatage avancénumber_format()
Templates complexesMoteurs Twig/Blade
Simple concatOpérateur . ou interpolation

✅ Nouveauté majeure affectant sprintf depuis PHP 8.4 : Optimisation automatique du compilateur

PHP 8.4 introduit une optimisation révolutionnaire pour sprintf(). Le moteur PHP compile automatiquement certains appels en interpolation de chaînes.

Conditions d’optimisation :

  • Format avec uniquement %s et %d.
  • Pas de formatage complexe (pas de padding, précision, etc.).

Transformation automatique :

// Code écrit
sprintf('user_%s_%d', $name, $id);

// Compilé automatiquement en
"user_{$name}_{$id}"

Avantages :

  • Suppression du coût d’appel de fonction.
  • Parsing du format éliminé.
  • Performance identique à l’interpolation native.
  • 90% des usages de sprintf() dans Symfony Benchmark concernés.

Cette optimisation fonctionne sans modification de code. Tu peux utiliser sprintf() pour la lisibilité sans perte de performance.

retour à la liste des fonctions

Sources : php.net

Cours

Variables et types

Manipulation de chaînes

Tableaux

Fichiers et système

Sécurité, session et cookie