2013-07-11 3 views
5

Sto lavorando a un progetto in cui ho bisogno di formattare una stringa con un sacco di cose ma la parte pertinente è la prima parte - il tempo di una Tour:Formatta la porzione di tempo di un DateTime con spazio iniziale per le ore a una cifra

Dato

DateTime start = Convert.ToDateTime(myClass.StartDateTime); 

Come posso riprodurre con string.Format per mostrare sia delle 10:00 o < spazio> 03:00?

So che posso usare una stringa di formato come:

string text = string.Format("{0:hh:mm tt}",_start); 

ma che mi dà uno zero (15:00) che io non voglio per ore a cifra singola.

C'è qualcosa che posso aggiungere nella stringa di formato per fare questo o devo sostituire manualmente uno spazio per uno zero iniziale? (Ho il sospetto che questo sia il caso ma volevo chiedere in modo da poter imparare come se c'è un metodo di formattazione.)

risposta

2

Se si vuole fare tutto con una stringa di formato, è possibile utilizzare un componente di allineamento . Vedere Composite Formatting su MSDN.

Format Articolo Sintassi

Ogni elemento formato ha la seguente forma e si compone dei seguenti componenti:

{index[,alignment][:formatString]}

...

Allineamento componente

Il componente di allineamento opzionale è un numero intero con segno che indica la larghezza del campo formattata preferita da . Se il valore dell'allineamento è inferiore a rispetto alla lunghezza della stringa formattata, l'allineamento viene ignorato e la lunghezza della stringa formattata viene utilizzata come larghezza del campo. I dati formattati nel campo sono allineati a destra se l'allineamento è positivo e allineato a sinistra se l'allineamento è negativo. Se è necessario il riempimento, viene utilizzato lo spazio bianco . La virgola è obbligatoria se è specificato l'allineamento.

Si vuole allineare a destra il risultato in un campo di otto caratteri, quindi è necessario utilizzare un componente allineamento positivo 8 con una stringa di formato con un unico h come nella risposta di @ David Stratton, in questo modo:

string _text = string.Format("{0,8:h:mm tt}", _start); 
+0

Come ha detto David, una risposta migliore. Grazie. – Deverill

6

dovrebbe farlo.

La singola "h" nella Stringa di formato ora farà in modo che lo zero non venga visualizzato se si tratta di una singola ora, mentre la funzione PadLeft assicurerà che sia la larghezza corretta.

+1

Idea pulita con PadLeft! – Greg

+0

Molto bello. Grazie. – Deverill

+1

Puoi anche usare un componente di allineamento nella stringa di formato per fare in modo che 'String.Format' faccia il padding per te:' string _text = string.Format ("{0,8: h: mm tt}", _start); ' – Quartermeister

6

È possibile avere un controllo condizionale nel sovraccarico ToString.

string _text = _start.ToString((_start.Hour > 9) ? "hh:mm tt" : " h:mm tt"); 
+0

Penso che potresti aver bisogno di un '% 12' e forse di più logica qui -' _start.Hour' va da '0' a' 23' ma 'h' e' hh' vanno da '1' a' 12' due volte – Rawling

+0

@Rawling - Scusa, non sto capendo bene. Potresti dare un tempo in cui quanto sopra potrebbe rompere i requisiti dell'OP? Il '> 9' era per rilevare se ci sono doppie cifre quindi suppongo che potresti sostituirlo con' _start.Hour.ToString(). Length> 1'. – keyboardP

+1

Bene, se è 1 PM, '_start.Hour' sarà' 13' ma 'hh' darà' 01'. – Rawling