2015-09-03 10 views
5

Ich brauche eine Variable mit String-Interpolation zu formatieren und die Format-String ist eine andere Variable:C# String-Interpolation mit variablem Format

hier ist mein Beispielcode:

static void Main(string[] args) 
{ 
    int i = 12345; 

    Console.WriteLine($"Test 1: {i:N5}"); 

    var formatString = "N5"; 

    Console.WriteLine($"Test 2: {i:formatString}"); 
} 

Test 1 Werken, Test 2 nicht funktionieren.

Wie lautet die genaue Syntax für Test 2?

Antwort

0

Die String-Interpolation erfolgt in der Kompilierungsstufe. Sie können deshalb keine Variablen in den Formatzeichenfolgen verwenden.

+1

Die Tatsache, dass es zum Zeitpunkt der Kompilierung läuft nichts mit dieser Einschränkung zu tun hat. Der Compiler könnte Ihre Zeichenfolge leicht in die Formatzeichenfolge verketten. – SLaks

+2

@SLaks Es könnte alles tun, aber es tut es nicht. Wäre eine bessere Antwort "weil es so gemacht wird"? –

+0

Eine bessere Antwort würde nur Ihren ersten Satz entfernen; Es ist überhaupt nicht relevant. – SLaks

2

C# hat keine Syntax, die das macht, was Sie wollen.

0

Ich habe dieses Stück Code getestet und es scheint zu funktionieren:

static void Main(string[] args) 
{ 
    int i = 12345; 

    Console.WriteLine("Test 1: {0:N5}",i); 

    var formatString = "N5"; 

    Console.WriteLine("Test 2: {0:" + formatString + "}", i); 

    Console.ReadLine(); 
} 
+1

Es ist jedoch keine String-Interpolation. –

+1

Es ist genau das, was ich gerne vermeiden würde, die alte Syntax von C# – Brainstorming

+0

Und könnten Sie mit einer doppelten Zeichenfolge tun.Format? 'Console.WriteLine (string.Format (" Test 2: {{0: {0}}} ", formatString), i);' – Marnix

3

Ihr Code entspricht:

Console.WriteLine(String.Format("Test 2: {0:formatString}", i)); 

Da die formatString im Format-String ist, würden Sie nisten String.Format ruft auf, um den Wert in die Formatzeichenkette zu setzen:

Console.WriteLine(String.Format(String.Format("Test 2: {{0:{0}}}", formatstring), i)); 

Dies ist nicht s unterstützt mit String-Interpolation.

+0

Kaum zu glauben, denn wenn ja, wäre eine große Einschränkung im Vergleich zum alten C# string.format – Brainstorming

+1

interessant durch Ihre Erklärung kann dies mit halber Interpolation und halben String-Format getan werden.Console.WriteLine ($ "Test 2: { {0: {formatString}}} ", i);' –

+0

Danke @ M.kazem.Akhgary, es funktioniert! ;-) – Brainstorming

1

Der kürzeste Weg Sie diesen ‚syntaktisch‘ tun können, ohne String.Format wird ToString mit:

$"Test 2: {i.ToString(formatString)}"