.NET Formatta una stringa con spazi fissi


199

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

"String va qui"
"String va qui"
"String va qui"

Come si fa usando .NET?

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

Modifica : ho commesso un errore e ho usato i due punti anziché una virgola nell'identificatore di formato. Dovrebbe essere "{0,20}".

Grazie per tutte le risposte eccellenti e corrette.


48
Non ho mai avuto una domanda sulla formattazione delle stringhe a cui non potevo rispondere andando su questa pagina: blog.stevex.net/index.php/string-formatting-in-csharp
jcollum

@jcollum: mi piacerebbe votare in alto la tua risposta ma non posso fare commenti
Dinah,

PadLeft funziona per me, controlla che stai lasciando lo spazio in PadLeft (20, 'HERE GOES A SPACE')
Jedi Master Spooky,

Cosa significa "lasciare lo spazio dentro". Se vuoi dire - sto "tagliando" la corda, allora no. Non funziona ancora.
user72491,

Risposte:


473

Questo ti darà esattamente le stringhe che hai richiesto:

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);

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

9
Se cerchi il segno di spunta verde rispetto ai voti più alti, non sai come SO;)
Dave Jellison,

2
@DaveJellison Sembra che qualcuno debba scrivere un plugin per risolvere il problema, o SO dovrebbe solo renderlo una preferenza configurabile per l'utente.
Walter Stabosz,

1
@WalterStabosz non potrebbe essere più d'accordo.
Dave Jellison,

2
perché questo viene fatto ,invece di :come in tutti gli altri casi d'uso di formattazione?
LuckyLikey,

65

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

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

49

A partire da Visual Studio 2015 puoi farlo anche con Interpolated Strings (è un trucco del compilatore, quindi non importa quale versione del framework .net sia targetizzata).

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

9
la sua funzione ac # 6.
LuckyLikey,

Uso C # 6 da anni e non lo sapevo! Votato :)
Avrohom Yisroel

17

Sei stato mostrato PadLefte PadRight. Questo riempirà il mancante PadCenter.

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 per sé: non dimenticare di aggiornare il proprio CV: "Un giorno, ho anche corretto il codice di Joel Coehoorn!" ;-D -Serge


Joel, buon frammento - Sto cercando di usarlo e non è del tutto centrato, così com'è. Sembra che la linea di ritorno dovrebbe essere qualcosa del tipo (non ho abbastanza rappresentante per la modifica ...): return s.PadLeft ((padding / 2) + s.Length, c) .PadRight (larghezza, c);
Shaunmartin,

11

prova questo:

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

per il centro prendi la lunghezza della corda e fai padleft e padright con i caratteri necessari

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

Sembra che le chiamate String.Format () siano superflue.
Joel Coehoorn,

I metodi del pad sono buoni poiché le opzioni di formato richiedono che le lunghezze siano costanti (ovvero, String.Format("{0,-length}", something)non verranno compilate.
Roberto

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 () accetta 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 alla lunghezza desiderata , verrà riempita con entrambe le estremità.
  4. A causa della spaziatura dei caratteri è intera e non c'è mezzo spazio, possiamo avere una divisione irregolare dello spazio. In questa implementazione, la divisione maggiore va alla fine.
  5. La funzione richiede .NET Framework a causa di PadLeft () e PadRight () .
  6. Nell'ultima riga della funzione, legame è da sinistra verso destra, in modo firstpad viene applicato seguita dalla desiredLength pad.

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 il primo pad variabile intero . s.PadLeft (firstpad) applica il (numero corretto di) spazi bianchi iniziali . Il PadRight più a destra (desiderataLunghezza) ha una rifinitura inferiore termina applicando spazi bianchi finali.


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

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

1

Ecco una versione di VB.NET che ho creato, ispirata alla risposta di Joel Coehoorn, alla modifica di Oliver e al 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

Questo è impostato come estensione stringa, all'interno di un modulo pubblico (il modo in cui esegui le estensioni in VB.NET, un po 'diverso da C #). La mia leggera modifica è che tratta una stringa nulla come una stringa vuota e riempie una stringa vuota con il valore di larghezza (soddisfa le mie esigenze particolari). Spero 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 ha ispirato il mio post, per favore fatemi sapere e lo farò - Sono relativamente nuovo nel postare e non sono riuscito a capire lascia un commento (potrebbe non avere ancora abbastanza rep).


0

Ho pubblicato un articolo di CodeProject che potrebbe essere quello che vuoi.

Vedi: AC # way per larghezza indiretta e formattazione dello stile.

Fondamentalmente è un metodo, FormatEx, che si comporta come String.Format, tranne per il fatto che consente un modificatore di allineamento centrato.

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

Significa centrare il valore di varArgs [0] in un campo largo di 10 caratteri, inclinarsi a destra se è richiesto uno spazio di riempimento aggiuntivo.

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

Significa centrare il valore di varArgs [0] in un campo largo di 10 caratteri, inclinarsi a sinistra se è richiesto uno spazio di riempimento aggiuntivo.

Modifica: internamente, è una combinazione di Joel's PadCenter con alcune analisi per ristrutturare il formato e varArgs per una chiamata a String.Format che fa quello che vuoi.

-Jesse


-1

sembra che tu voglia qualcosa del genere, che metterà la tua 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 la totallength


-7
/// <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 identificatori di formato incorporato e i metodi di riempimento.
Oskar Berggren,

1
santo .. immagina di usarlo all'interno di un ciclo :)
LuckyLikey
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.