Problema con la formattazione di una stringa con String.Format in C #
-
02-10-2019 - |
Domanda
Ho bisogno di stampare una stringa in una finestra di messaggio in formato specifico per il quale sto usando un codice simile a come illustrato di seguito:
string text="";
for (int i=0; i<n; i++)
{
a=..
b=..
c=..
text += String.Format("{0, -8} {1,-4} {2,8}", a, b, c);
}
MessageBox.Show(text);
Quindi, per seguire insieme di valori:
XYZ,ABC,100
X,ABC,100
ottengo seguente output:
XYZ ABC 100
X ABC 100
Così si può vedere la seconda linea non è ben formattato. Probabilmente questo accade perché sto stampando questo MessageBox. Lo spazio di un carattere e uno 'spazio' che serve è diversa. Qualsiasi soluzione per questo?
Soluzione
Provare a usare un \t
per inserire le schede tra i valori.
Altri suggerimenti
Questo non funziona perché MessageBox utilizza un font spaziatura proporzionale, la lettera M è molto più ampia rispetto alla lettera l. Proprio come è in questo messaggio che state leggendo ora. Ci si può aspettare solo l'allineamento come questo per funzionare se viene visualizzato con un carattere a passo fisso. Cambiare il tipo di carattere finestra di messaggio non è appropriato, è un'impostazione di sistema.
Si può ottenere un po 'meglio utilizzando schede:
text += String.Format("{0}\t{1}\t{2}", a, b, c);
, ma non è infallibile se la dimensione del campo si avvicina al formato scheda. Utilizzare un ListView con Vista = dettagli posto.
Non sono sicuro se in realtà è quello che vuoi dire, ma utilizza un spaziatura fissa font come " Courier New ". Se hai già fatto, quindi mi dispiace per questa risposta ovvia.
Nevermind: non è possibile con il MessageBox standard di accoding a questo discussione . Forse allora un'opzione è quella di creare la propria classe MessageBox.
Un test creato in Windows Applicazione con il seguente codice:
public void Test1()
{
List<List<String>> list = new List<List<string>>() {
new List<String>() { "XYZ", "ABC","100" },
new List<String>() { "X", "ABC", "100"},
};
string text = "", a = "", b = "", c = "";
for (int i = 0; i < list.Count; i++)
{
a = list[i][0];
b = list[i][1];
c = list[i][2];
text += String.Format("{0, -8} {1,-4} {2,8}{3}", a, b, c, Environment.NewLine);
}
MessageBox.Show(text);
}
fa quello che hai detto, ma dopo aver verificato con l'applicazione di console con il seguente codice:
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Test1();
Console.ReadKey();
}
public static void Test1()
{
List<List<String>> list = new List<List<string>>() {
new List<String>() { "XYZ", "ABC","100" },
new List<String>() { "X", "ABC", "100"},
};
string text = "", a = "", b = "", c = "";
for (int i = 0; i < list.Count; i++)
{
a = list[i][0];
b = list[i][1];
c = list[i][2];
text += String.Format("{0, -8} {1,-4} {2,8}{3}", a, b, c, Environment.NewLine);
}
Console.WriteLine(text);
}
}
}
Si fa quello che ci si aspetta.
Quindi, quali sono le prove suggeriscono è che se sta facendo quello che deve fare, ma con la mancanza di stesso carattere larghezza nella MessageBox
, che non è allineata correttamente. Ma d'altra parte, con l'applicazione di console utilizzando gli stessi caratteri di larghezza, lo fa line up esattamente.
La classe MessageBox, sia dalle forme o WPF, è solo un wrapper per la finestra di messaggio win32, quindi un programmatore non è in grado di (facilmente) fare le cose come il cambiamento del carattere di un carattere a passo fisso in modo che tutti i caratteri linea piacevolmente con la formattazione delle stringhe.
Si potrebbe, tuttavia, rendere il proprio clone di MessageBox utilizzando un modulo e un marchio (e qualunque tasti necessari), poi mostrarlo utilizzando il metodo ShowDialog ().