2015-09-03 10 views
5

ho bisogno di formattare una variabile con interpolazione stringa e la stringa di formato è un'altra variabile:C# stringa di interpolazione con il formato variabile

qui è il mio codice di esempio:

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

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

    var formatString = "N5"; 

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

prova 1 opere, Test 2 non lavorare

Qual è la sintassi esatta per Test 2?

risposta

0

L'interpolazione della stringa avviene nella fase di compilazione. Non è possibile utilizzare le variabili nelle stringhe di formato a causa di ciò.

+1

Il fatto che venga eseguito a tempo di compilazione non ha nulla a che fare con questa limitazione. Il compilatore potrebbe facilmente concatenare la stringa nella stringa di formato. – SLaks

+2

@SLaks Potrebbe fare qualsiasi cosa, ma non è così. Una risposta migliore sarebbe "perché è fatta in questo modo"? –

+0

Una risposta migliore rimuove solo la prima frase; non è affatto rilevante. – SLaks

2

C# non ha una sintassi che farà ciò che desideri.

0

Ho testato questo pezzo di codice e sembra funzionare:

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

Tuttavia non è un'interpolazione di stringa. –

+1

È esattamente quello che vorrei evitare, la vecchia sintassi di C# – Brainstorming

+0

E potresti fare con una doppia stringa.Formato? 'Console.WriteLine (string.Format (" Test 2: {{0: {0}}} ", formatString), i);' – Marnix

3

Il codice è equivalente a:

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

Come il formatString è nella stringa di formato, si farebbe nido String.Format chiama per inserire il valore nella stringa di formato:

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

Questo non è s upported con interpolazione di stringa.

+0

Difficile da credere, perché se così fosse sarebbe una grossa limitazione rispetto al vecchio C# string.format – Brainstorming

+1

interessante dalla tua spiegazione questo può essere fatto con mezzo interpolazione e mezzo formato di stringa .Console.WriteLine ($ "Test 2: { {0: {formatString}}} ", i);' –

+0

Grazie @ M.kazem.Akhgary, funziona! ;-) – Brainstorming

1

La via più breve è possibile farlo 'sintatticamente' senza String.Format, sta utilizzando ToString:

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