Självstudie: Använda stränginterpolation för att skapa en rapport i C#

I den här självstudien skapar du en liten filbaserad app som skriver ut en formaterad ordersammanfattning. Längs vägen använder du stränginterpolation för att infoga värden i text, formatera tal och valuta, rada upp kolumner och producera kulturspecifika utdata.

Den här handledningen förutsätter att du känner till grundläggande C#-begrepp. En funktionsspecifik referens för interpoleringssyntax finns i Stränginterpolation.

Förutsättningar

Skapa appen

En filbaserad app är en enda .cs fil som du kör utan en projektfil. Skapa en mapp för appen och flytta till den:

mkdir StringInterpolation
cd StringInterpolation

Skapa en tom fil med namnet report.cs i mappen och öppna den i redigeringsprogrammet. Du lägger till kod i den i avsnitten som följer och kör appen med dotnet run report.cs.

Infoga värden i text

Prefixa en strängliteral med $ för att göra den till en interpolerad sträng. I strängen placerar du alla C#-uttryck i klammerparenteser ({ och }); C# utvärderar uttrycket, konverterar resultatet till en sträng och infogar det.

Lägg till följande kod i report.cs och kör sedan appen med dotnet run report.cs:

string name = "Maria";
int itemCount = 3;

// Prefix a string literal with $ to interpolate expressions inside braces.
Console.WriteLine($"Hello, {name}! You have {itemCount} items in your cart.");
// => Hello, Maria! You have 3 items in your cart.

Resultatet kombinerar den bokstavliga texten med värdena för name och itemCount.

Formatera tal och valuta

I en ordersammanfattning visas belopp och satser, så obearbetade tal som 23.5 eller 0.08 ser ofärdiga ut och är svåra att läsa. Presentera varje värde som kunden förväntar sig: ett pris med en valutasymbol och en skattesats i procent. Formatera den som en del av interpoleringen.

Om du vill formatera ett värde följer du uttrycket med ett kolon (:) och en formatsträng. Standardformatsträngarna C och P0 skapar valuta- och heltalsprocent. Lägg till följande kod i slutet av filen:

decimal subtotal = 23.5m;
decimal taxRate = 0.08m;

// Follow an expression with :format to apply a standard or custom format string.
Console.WriteLine($"Subtotal: {subtotal:C}");
Console.WriteLine($"Tax rate: {taxRate:P0}");
Console.WriteLine($"Total:    {subtotal * (1 + taxRate):C}");
// => Subtotal: $23.50
// => Tax rate: 8%
// => Total:    $25.38

Formatsträngen tillämpar konventionerna i den aktuella kulturen, så valutasymbolen och avgränsarna matchar datorns inställningar.

Justera värden i kolumner

När du skriver ut flera rader med data lämnar värden med olika längd kolumnerna ojämna och svåra att skanna. Om du vill rada upp varje namn och tal under en konsekvent rubrik ger du varje fält en fast bredd så att kolumnerna förblir raka oavsett hur länge varje värde är.

Om du vill ange en minsta fältbredd följer du uttrycket med kommatecken (,) och bredd. En positiv bredd högerjusterar värdet. en negativ bredd vänsterjusterar den. Kombinera bredd och en formatsträng som {expression,width:format}. Lägg till följande kod för att skriva ut en tabellsammanfattning:

(string Name, int Quantity, decimal Price)[] orders =
[
    ("Espresso", 2, 3.50m),
    ("Cappuccino", 1, 4.25m),
    ("Tea", 4, 2.00m),
];

// Follow an expression with ,width to set a minimum field width.
// A positive width right-aligns; a negative width left-aligns.
foreach (var order in orders)
{
    Console.WriteLine($"{order.Name,-12}{order.Quantity,3}{order.Price * order.Quantity,10:C}");
}
// => Espresso      2     $7.00
// => Cappuccino    1     $4.25
// => Tea           4     $8.00

Den vänsterjusterade namnkolumnen och högerjusterade numeriska kolumner radas upp i en läsbar tabell.

Producera kulturspecifika utdata

En interpolerad sträng använder den aktuella kulturen som standard. När du behöver en specifik kultur, till exempel ett fast format för loggar eller ett språk för ett kvitto, skickar du en kultur till String.Create(IFormatProvider, DefaultInterpolatedStringHandler). Lägg till följande kod:

decimal total = 1234.56m;

// An interpolated string uses the current culture by default.
// Use string.Create with a culture to control the formatting explicitly.
string germanReceipt = string.Create(
    new CultureInfo("de-DE"), $"Gesamt: {total:C}");
string invariantLog = string.Create(
    CultureInfo.InvariantCulture, $"total={total:F2}");

Console.WriteLine(germanReceipt);
Console.WriteLine(invariantLog);
// => Gesamt: 1.234,56 €
// => total=1234.56

Det tyska kvittot använder ett kommatecken som decimalavgränsare och eurosymbolen. Den invarianta loggen använder en punkt och ingen symbol, oavsett datorns kultur.

Nästa steg

Du använde stränginterpolation för att infoga, formatera, justera och lokalisera värden. Den fullständiga uppsättningen interpoleringsfunktioner, inklusive råa strängliteraler, undantagna klammerparenteser och konstanta interpolerade strängar, finns i konceptartikeln:

Se även