2009-03-13 16 views
140

Il metodo .NET String.Format consente il posizionamento di una stringa in una posizione fissa all'interno di una stringa di lunghezza fissa..NET Formatta una stringa con spazi fissi

 
"   String Goes Here" 
"  String Goes Here  " 
"String Goes Here   " 

Come è fatto utilizzando .NET?

Modifica - Ho provato Format/PadLeft/PadRight a morte. Loro non lavorano. Non so perché. Ho finito per scrivere la mia funzione per farlo.

Modifica - Ho fatto un errore e ho usato i due punti invece di una virgola nello specificatore di formato. Dovrebbe essere "{0,20}".

Grazie per tutte le risposte eccellenti e corrette.

+37

Non ho mai avuto una domanda di formattazione che non ho potuto rispondere andando a questa pagina: http://blog.stevex.net/index.php/string-formatting-in-csharp/ – jcollum

+0

@jcollum: Mi piacerebbe votare la tua risposta ma non posso fare per i commenti – Dinah

+0

PadLeft lavora per me controlla che stai lasciando lo spazio in PadLeft (20, 'QUI VA UN SPAZIO') –

risposta

49

Il primo e l'ultimo, almeno, sono possibili utilizzando la seguente sintassi:

String.Format("{0,20}", "String goes here"); 
String.Format("{0,-20}", "String goes here"); 
+0

Ho provato il tuo suggerimento. Non funziona. – user72491

+0

Riprova; all'inizio il mio codice conteneva un errore di battitura, ho usato ':' invece di ',' ma ho corretto questo ora. –

8

provare questo:

"String goes here".PadLeft(20,' '); 
"String goes here".PadRight(20,' '); 

per il centro ottenere la lunghezza della stringa e fare PadLeft e padrone con i caratteri necessari

int len = "String goes here".Length; 
int whites = len /2; 
"String goes here".PadRight(len + whites,' ').PadLeft(len + whites,' '); 
+0

Sembra che le chiamate String.Format() siano superflue. –

+0

Sì, non so perché l'ho lasciato, sto modificando ora. –

-1

sembra che tu voglia qualcosa come questo, che w ill posto che stringa in un punto fisso in una stringa di lunghezza costante:

Dim totallength As Integer = 100 
Dim leftbuffer as Integer = 5 
Dim mystring As String = "string goes here" 
Dim Formatted_String as String = mystring.PadLeft(leftbuffer + mystring.Length, "-") + String.Empty.PadRight(totallength - (mystring.Length + leftbuffer), "-") 

nota che questo avrà problemi se MyString.Length + leftbuffer supera totallength

14

Sei stato mostrato PadLeft e PadRight. Questo riempirà il PadCenter mancante.

public static class StringUtils 
{ 
    public static string PadCenter(this string s, int width, char c) 
    { 
     if (s == null || width <= s.Length) return s; 

     int padding = width - s.Length; 
     return s.PadLeft(s.Length + padding/2, c).PadRight(width, c); 
    } 
} 

Nota a sé: non dimenticate di aggiornare il proprio CV: "Un giorno, ho anche fissato il codice di Joel Coehoorn" ;-D -Serge

+0

Joel, buon frammento - Sto provando ad usarlo e non è al centro, così com'è. Sembra che la linea di ritorno dovrebbe essere qualcosa di simile (non ho abbastanza rep per modificare ...): return s.PadLeft ((padding/2) + s.Length, c) .PadRight (width, c) ; – shaunmartin

356

Questo vi darà esattamente le stringhe che si chiedeva:

string s = "String goes here"; 
string lineAlignedRight = String.Format("{0,27}", s); 
string lineAlignedCenter = String.Format("{0,-27}", 
    String.Format("{0," + ((27 + s.Length)/2).ToString() + "}", s)); 
string lineAlignedLeft = String.Format("{0,-27}", s); 
+49

Questo dovrebbe essere contrassegnato come la risposta corretta alla domanda, ma sembra che l'OP abbia lasciato lo stackoverflow. – Oliver

+7

Se cerchi il segno di spunta verde rispetto ai voti più alti, non sai come farlo;) –

+2

@DaveJellison Sembra che qualcuno abbia bisogno di scrivere un plug-in per correggerlo, o SO dovrebbe semplicemente renderlo un utente configurabile preferenza. –

1

Ecco una versione VB.NET ho creato, ispirato alla risposta di Joel Coehoorn, modificare di Oliver, e il commento di shaunmartin:

<Extension()> 
Public Function PadCenter(ByVal [string] As String, ByVal width As Integer, ByVal c As Char) As String 

    If [string] Is Nothing Then [string] = String.Empty 
    If (width <= [string].Length) Then Return [string] 

    Dim padding = width - [string].Length 
    Return [string].PadLeft([string].Length + (padding \ 2), c).PadRight(width, c) 

End Function 

<Extension()> 
Public Function PadCenter(ByVal [string] As String, ByVal width As Integer) As String 

    If [string] Is Nothing Then [string] = String.Empty 
    If (width <= [string].Length) Then Return [string] 

    Dim padding = width - [string].Length 
    Return [string].PadLeft([string].Length + (padding \ 2)).PadRight(width) 

End Function 

Questa è impostato come interno di stringa, all'interno di un modulo pubblico (il modo di fare le estensioni in VB.NET, un po 'diverso rispetto a C#). Il mio piccolo cambiamento è che tratta una stringa nulla come una stringa vuota, e riempie una stringa vuota con il valore della larghezza (soddisfa le mie particolari esigenze). Speriamo che questo si converta facilmente in C# per chiunque ne abbia bisogno. Se c'è un modo migliore per fare riferimento alle risposte, alle modifiche e ai commenti che ho menzionato sopra, che hanno ispirato il mio post, per favore fatemelo sapere e lo farò - Sono relativamente nuovo al post, e non sono riuscito a capire lascia un commento (potrebbe non avere ancora abbastanza rep).

0

Ho pubblicato un articolo CodeProject che potrebbe essere quello che desideri.

Vedi: A C# way for indirect width and style formatting.

Praticamente è un metodo, FormatEx, che agisce come String.Format, tranne che permette un modificatore allineamento centrato.

FormatEx("{0,c10}", value); 

Mezzi centrare il valore di varargs [0] in un ampio campo di 10 caratteri, magra destra se è richiesto uno spazio imbottitura extra.

FormatEx("{0,c-10}", value); 

Mezzi centrare il valore di varargs [0] in un ampio campo di 10 caratteri, magra sinistra se è richiesto uno spazio imbottitura extra.

Modifica: internamente, è una combinazione di Joel PadCenter con alcune analisi per ristrutturare il formato e varArgs per una chiamata a String.Format che esegue ciò che si desidera.

-Jesse

6

Grazie per la discussione, questo metodo funziona anche (VB):

Public Function StringCentering(ByVal s As String, ByVal desiredLength As Integer) As String 
    If s.Length >= desiredLength Then Return s 
    Dim firstpad As Integer = (s.Length + desiredLength)/2 
    Return s.PadLeft(firstpad).PadRight(desiredLength) 
End Function 
  1. StringCentering() prende due valori di input e restituisce una stringa formattata .
  2. Quando la lunghezza di s è maggiore o uguale a deisredLength, la funzione restituisce la stringa originale.
  3. Quando la lunghezza di s è inferiore a lunghezza desiderata, sarà riempito con entrambe le estremità.
  4. A causa della spaziatura tra i caratteri è intero e non c'è un semispazio, possiamo avere una divisione irregolare dello spazio. In questa implementazione, la divisione maggiore va alla fine principale.
  5. La funzione richiede .NET Framework a causa di PadLeft() e PadRight().
  6. Nell'ultima riga della funzione, il rilegatura va da sinistra a destra, quindi viene applicato firstpad seguito dal pad desiderato Lunghezza.

Ecco la versione C#:

public string StringCentering(string s, int desiredLength) 
{ 
    if (s.Length >= desiredLength) return s; 
    int firstpad = (s.Length + desiredLength)/2; 
    return s.PadLeft(firstpad).PadRight(desiredLength); 
} 

Per facilitare la comprensione, viene utilizzato variabile intera firstpad. s.PadLeft (firstpad) applica il (numero corretto di) spazi bianchi iniziali. Il valore più a destra di PadRight (lunghezza desiderata) ha una rilegatura inferiore che si applica applicando spazi bianchi finali.

+0

Benvenuti in SO, chi. Questo è ancora un altro esempio di GRANDE primo post e risposta. +1 – Brian

+0

Grazie Brian, la domanda originale all'inizio di questo post è un ottimo punto di partenza. Sono ispirato da tutti i post e le risposte che precedono il mio. – chi

-6
/// <summary> 
/// Returns a string With count chars Left or Right value 
/// </summary> 
/// <param name="val"></param> 
/// <param name="count"></param> 
/// <param name="space"></param> 
/// <param name="right"></param> 
/// <returns></returns> 
public static string Formating(object val, int count, char space = ' ', bool right = false) 
{ 
    var value = val.ToString(); 
    for (int i = 0; i < count - value.Length; i++) value = right ? value + space : space + value; 
    return value; 
} 
+3

Non utilizzare questo codice: genera molte allocazioni di stringhe non necessarie. Utilizzare invece gli specificatori di formato incorporato e i metodi di riempimento. –

+1

santo .. immagina di usarlo all'interno di un ciclo :) – LuckyLikey

13

Come di Visual Studio 2015 è anche possibile fare questo con Interpolated Strings (il suo un trucco compilatore, quindi non importa quale versione di .NET Framework si target).

string value = "String goes here"; 
string txt1 = $"{value,20}"; 
string txt2 = $"{value,-20}"; 
+1

è una funzione C# 6. – LuckyLikey

Problemi correlati