Menu

Interpolation de chaînes et String.Format en C# : spécificateurs de format, alignement, culture

Comment fonctionne l'interpolation de chaînes $"..." en C# : expressions entre accolades, spécificateurs de format comme F2, N0, C, D5 et X, alignement pour les tableaux, échappement des accolades, string.Format et formatage composite, chaînes interpolées verbatim et brutes, et formatage pour une culture précise.

Cette page contient des éditeurs exécutables - modifiez, exécutez et voyez la sortie instantanément.

L'interpolation de chaînes construit une chaîne à partir de texte littéral et d'expressions. Préfixez le littéral par $, placez n'importe quelle expression C# entre accolades, et sa valeur est convertie en texte puis insérée :

Sortie :

Hello, Maya!
3 items at 4.5 = 13.5
Name has 4 letters, upper: MAYA
Free shipping: yes

L'interpolation est arrivée avec C# 6. Le compilateur la transforme en appel à string.Format ou string.Concat (ou, depuis C# 10, en code de handler plus efficace), elle n'est donc pas plus lente que la construction manuelle de la chaîne.

L'expression conditionnelle de la dernière ligne a besoin de parenthèses. Dans un emplacement d'interpolation, les deux-points commencent un spécificateur de format, donc {x > 10 ? "yes" : "no"} sans parenthèses est une erreur de compilation.

Spécificateurs de format

Après l'expression, deux-points suivis d'une chaîne de format déterminent la façon dont la valeur est écrite. Les mêmes chaînes de format fonctionnent avec ToString("...") et string.Format.

Sortie :

1234567.89
1,234,567.89
1,234,568
00042
FF
00ff
1.23E+006
0.813
81.3%
1,234,567.89
007.5
3.1

Les codes standard, chacun éventuellement suivi d'un nombre de précision :

CodeNomExempleRésultat
F ou F2Virgule fixe{3.14159:F2}3.14
N ou N0Nombre avec séparateurs de groupes{1234.56:N0}1,235
CMonétaire (symbole et modèle de la culture){9.5:C} en en-US$9.50
D5Entier complété par des zéros{42:D5}00042
X, xHexadécimal{255:X}FF
E2Scientifique{1234.5:E2}1.23E+003
P1Pourcentage (multiplie par 100){0.256:P1} en en-US25.6%
GGénéral (le plus court){2.50m:G}2.50
RAller-retour (double){0.1:R}0.1

Les modèles personnalisés construisent un format à partir d'espaces réservés : 0 est un chiffre toujours affiché, # un chiffre affiché seulement s'il est significatif, . le séparateur décimal, , dans le nombre active les séparateurs de groupes, et % multiplie par 100. "0.##" affiche jusqu'à deux décimales et supprime les zéros de fin ; "#,##0.00" est le format comptable classique.

Tout formatage numérique arrondit la valeur affichée ; la variable elle-même reste inchangée. Quand une valeur tombe exactement à mi-chemin (2,25 affiché avec une décimale), les runtimes et les types peuvent arrondir l'égalité différemment ; si la règle compte, arrondissez d'abord explicitement avec Math.Round(value, 1, MidpointRounding.AwayFromZero), puis formatez.

Les dates dans l'interpolation

Les valeurs DateTime acceptent de la même façon des chaînes de format de date :

Sortie :

2026-09-24
24/09/2026 16:05
Thu, Sep 24
Shipped at 16:05 on Thursday
ETA 02:10
2.2 hours

Un format personnalisé de TimeSpan exige que les caractères littéraux soient échappés par une barre oblique inverse, ce qui s'écrit \\: dans un littéral de chaîne ordinaire. La liste complète des codes de date (yyyy, MM, HH, tt...) et les erreurs qu'on commet avec eux (mm désigne les minutes, MM les mois) se trouvent sur format DateTime.

Alignement et remplissage

Une virgule après l'expression définit une largeur minimale de champ. Un nombre positif aligne à droite, un nombre négatif à gauche. Combiné à un format, cela aligne des tableaux en texte brut :

Sortie :

Item          |  Price| Sold
----------------------------
Espresso      |   2.40|  118
Latte         |   3.60|   64
Hot chocolate |   4.25|    9

La syntaxe est {expression,alignment:format} : l'alignement d'abord, puis le format. Une valeur plus longue que la largeur n'est pas tronquée ; elle décale le reste de la ligne. PadLeft et PadRight font le même remplissage hors interpolation.

Échapper les accolades

Pour afficher une accolade littérale, doublez-la : {{ et }}. Cela arrive quand la sortie est du JSON, du CSS ou du code :

Sortie :

{ "id": 42, "name": "Ana" }
Set literal: {1, 2, 3}
{42}

Construire du JSON à la main de cette façon convient pour une ligne de log rapide ; pour du vrai JSON, utilisez un sérialiseur, qui gère correctement les guillemets et les caractères spéciaux dans name.

string.Format et le formatage composite

Avant C# 6, on formatait avec string.Format, qui prend des espaces réservés numérotés et une liste d'arguments. La même syntaxe de format composite est acceptée par Console.WriteLine, StringBuilder.AppendFormat et TextWriter.Write :

Sortie :

Notebook x4: 14.00
Notebook  |  3.50
echo echo !
Dear Leo, your order #000731 has shipped.

Préférez l'interpolation dans le code : les valeurs se trouvent là où elles apparaissent, donc un espace réservé ne peut pas pointer vers le mauvais argument. string.Format reste le bon outil quand le modèle est une donnée, comme un message traduit chargé depuis un fichier de ressources. Un index d'espace réservé sans argument correspondant ({2} avec deux arguments) lève une FormatException à l'exécution.

La culture : contrôler les séparateurs et la devise

L'interpolation, ToString et string.Format utilisent tous par défaut la culture courante du thread. Sur une machine réglée en allemand, {1234.5:N2} produit 1.234,50 ; aux États-Unis, 1,234.50. Le format monétaire C utilise le symbole de la culture. Pour choisir la culture explicitement, capturez la chaîne interpolée comme un FormattableString et formatez-la avec un fournisseur :

Sortie :

Total: 1,234.50
Total: 1.234,50
$1,234.50
1.234,50
1234.5,0.75

Utilisez la culture de l'utilisateur pour le texte que lisent les personnes, et CultureInfo.InvariantCulture pour tout ce qu'un autre programme lit. Un CSV écrit avec la culture courante sur une machine allemande contient des virgules dans les nombres et devient illisible ailleurs. Depuis .NET 6, string.Create(CultureInfo.InvariantCulture, $"...") fait la même chose que FormattableString.Invariant sans l'objet intermédiaire.

Chaînes interpolées verbatim et brutes

$ se combine avec @ pour une chaîne interpolée verbatim : les barres obliques inverses sont littérales et la chaîne peut s'étendre sur plusieurs lignes. C# 8 et plus acceptent les deux ordres ($@ ou @$) ; C# 6 et 7 exigent $@ :

Sortie :

C:\Users\ana\Reports\2026\summary.txt
Report for ana
Year: 2026

C# 11 a ajouté les chaînes interpolées brutes. Avec un seul $, les accolades marquent les expressions comme d'habitude. Avec $$, une accolade simple est littérale et les expressions demandent deux accolades, ce qui rend lisibles les modèles JSON et de code :

// C# 11 and later
int id = 42;
string name = "Ana";
string json = $$"""
    {
      "id": {{id}},
      "name": "{{name}}"
    }
    """;

C# 11 autorise aussi les sauts de ligne dans un emplacement d'interpolation, si bien qu'une longue expression ou une expression switch peut être répartie sur plusieurs lignes.

Erreurs courantes

  • Oublier le $. "Total: {total}" affiche les accolades telles quelles. Le compilateur ne prévient pas.
  • Un ternaire sans parenthèses entre les accolades : les deux-points sont lus comme un séparateur de format.
  • Formater une sortie lue par des machines avec la culture courante. Les virgules décimales cassent le CSV, le JSON et le SQL. Utilisez la culture invariante.
  • Utiliser ToString() sans format pour de l'argent. 2.5m s'affiche 2.5, pas 2.50. Utilisez F2, N2 ou C.
  • Construire de grandes chaînes avec l'interpolation dans une boucle. Chaque itération crée une nouvelle chaîne ; utilisez StringBuilder ou string.Join.

Questions fréquentes

Qu'est-ce que l'interpolation de chaînes en C# ?

Un littéral de chaîne préfixé par $, dans lequel les expressions entre accolades sont évaluées puis insérées : $"Total: {price * qty}". Elle a été ajoutée en C# 6 et remplace la plupart des usages de string.Format et de la concaténation avec +. Toute expression fonctionne entre les accolades, y compris les appels de méthode et l'accès aux propriétés.

Comment afficher un nombre avec 2 décimales en C# ?

Ajoutez un spécificateur de format après deux-points : $"{price:F2}" affiche 2 chiffres après la virgule, et $"{price:N2}" fait de même avec des séparateurs de milliers. Hors interpolation, les mêmes codes fonctionnent avec price.ToString("F2"). Les deux arrondissent la valeur pour l'affichage sans la modifier.

Comment échapper les accolades dans une chaîne interpolée C# ?

Doublez-les : {{ affiche { et }} affiche }. Par exemple, $"{{ \"id\": {id} }}" affiche { "id": 42 }. Avec les chaînes interpolées brutes de C# 11, vous pouvez plutôt commencer le littéral par $$ pour que les accolades simples soient littérales et que {{expr}} marque une expression.

Quelle est la différence entre string.Format et l'interpolation de chaînes ?

Elles produisent le même résultat avec les mêmes codes de format. string.Format("{0} costs {1:F2}", name, price) désigne les arguments par position ; $"{name} costs {price:F2}" place les expressions dans le texte, ce qui se lit plus facilement et ne peut pas inverser l'ordre des arguments. string.Format reste nécessaire quand la chaîne de format elle-même vient d'un fichier de ressources ou d'une base de données.

Pourquoi mon nombre interpolé affiche-t-il une virgule au lieu d'un point ?

L'interpolation formate avec la culture courante du thread, et beaucoup de cultures utilisent la virgule comme séparateur décimal. Pour une sortie lue par des machines (fichiers, JSON, URL), formatez avec la culture invariante : FormattableString.Invariant($"{value:F2}"), ou depuis .NET 6 string.Create(CultureInfo.InvariantCulture, $"...").

Coddy programming languages illustration

Apprendre à coder avec Coddy

COMMENCER