What does {1:C} in C# mean when found inside a string?
Categories:
Understanding '{1:C}' in C# String Formatting

Explore the meaning and usage of the '{1:C}' format specifier in C# strings, a powerful tool for currency formatting and more.
In C#, you often encounter special syntax within strings, particularly when dealing with string.Format()
or interpolated strings. One such common pattern is {1:C}
. This article will demystify what this syntax means, how it works, and how you can leverage it for effective string formatting, especially for currency values.
The Basics of C# String Formatting
Before diving into {1:C}
, it's crucial to understand the general structure of format specifiers in C#. When you use string.Format("...")
or an interpolated string $ "..."
, you're providing a format string that contains placeholders. These placeholders are enclosed in curly braces {}
and typically consist of an index and an optional format specifier.
string name = "Alice";
int age = 30;
// Using string.Format
string formattedString1 = string.Format("Hello, {0}. You are {1} years old.", name, age);
Console.WriteLine(formattedString1);
// Using interpolated string (C# 6.0+)
string formattedString2 = $"Hello, {name}. You are {age} years old.";
Console.WriteLine(formattedString2);
Basic string formatting with indexed placeholders and interpolated strings.
Deconstructing '{1:C}'
The syntax {1:C}
breaks down into two main parts:
1
(Index): This number indicates the zero-based index of the argument in thestring.Format
method's parameter list, or the position of the variable in an interpolated string. So,1
refers to the second argument provided.:C
(Format Specifier): This is a standard numeric format specifier. TheC
stands for 'Currency'. When applied to a numeric value, it formats the number as a currency value, typically including a currency symbol, appropriate decimal places, and group separators, all based on the current culture's settings.
CultureInfo
of the current thread. This means the currency symbol, decimal separator, and thousands separator can change based on the user's regional settings.flowchart TD A["Input: Number (e.g., 1234.56)"] --> B{"Format String: '{1:C}'"} B --> C{"Index '1' selects the second argument"} C --> D{"Format Specifier ':C' applies Currency formatting"} D --> E["Current Culture Info (e.g., en-US, fr-FR)"] E --> F["Output: Formatted Currency String (e.g., $1,234.56, 1 234,56 €)"]
Flowchart illustrating how '{1:C}' processes a number into a currency string.
Practical Examples of Currency Formatting
Let's look at some code examples to see {1:C}
in action, demonstrating how it adapts to different cultures.
using System;
using System.Globalization;
double price = 1234.56;
int quantity = 2;
// Example 1: Using string.Format with default culture (e.g., en-US)
string output1 = string.Format("Item: Product A, Price: {1:C}, Quantity: {0}", quantity, price);
Console.WriteLine($"Default Culture (en-US assumed): {output1}");
// Expected output: Item: Product A, Price: $1,234.56, Quantity: 2
// Example 2: Using interpolated string with default culture
string output2 = $"Item: Product B, Price: {price:C}, Quantity: {quantity}";
Console.WriteLine($"Default Culture (en-US assumed): {output2}");
// Expected output: Item: Product B, Price: $1,234.56, Quantity: 2
// Example 3: Formatting for a specific culture (e.g., France)
CultureInfo frenchCulture = new CultureInfo("fr-FR");
string output3 = string.Format(frenchCulture, "Item: Product C, Price: {1:C}, Quantity: {0}", quantity, price);
Console.WriteLine($"French Culture (fr-FR): {output3}");
// Expected output: Item: Product C, Price: 1 234,56 €, Quantity: 2
// Example 4: Formatting for a specific culture (e.g., Japan)
CultureInfo japaneseCulture = new CultureInfo("ja-JP");
string output4 = string.Format(japaneseCulture, "Item: Product D, Price: {1:C}, Quantity: {0}", quantity, price);
Console.WriteLine($"Japanese Culture (ja-JP): {output4}");
// Expected output: Item: Product D, Price: ¥1,235, Quantity: 2 (Note: Japanese Yen typically has no decimal places)
Demonstrating '{1:C}' with string.Format
and interpolated strings across different cultures.
{variableName:C}
. The index is implicit.