2010-07-11 18 views
23

sto facendo un po 'di matematica con i timespans in .Net, e di tanto in tanto i risultati somma in un periodo negativo. Quando visualizzo il risultato ho problemi a formattarlo per includere l'indicatore negativo.Formattazione di un periodo negativo

Dim ts as New Timespan(-10,0,0) 

ts.ToString() 

Questo mostrerà "-10: 00: 00", che è buono, ma non voglio mostrare i secondi, in modo provato questo.

ts.ToString("hh\:mm") 

Questo restituisce "10:00" e ha fatto cadere il "-" dalla parte anteriore, che è il punto cruciale della questione. La mia soluzione corrente è questa:

If(ts < TimeSpan.Zero, "-", "") & ts.ToString("hh\:mm") 

ma speravo di ottenere lo stesso utilizzando solo la stringa di formato.

+0

Così molto strano. MSDN suggerisce che questo è supportato, attraverso il formato 'c', ma se lo si utilizza in un formato personalizzato, si blocca http://msdn.microsoft.com/en-us/library/ee372286(v=vs.100). aspx –

risposta

11

Ho usato .Net Reflector su TimeSpan.ToString (...) e in realtà non sembra che supporti alcuna forma di prefisso negativo su formati personalizzati - quindi penso che sei sfortunato quando arriva a farlo funzionare per te come sopra. :(

2

Sono d'accordo con Will. MSDN e Reflector indicano entrambi che sei sfortunato. Il meglio che otterrai è utilizzare quello che hai, scrivere il tuo IFormatProvider o utilizzare uno degli standard formati per intervalli come "g".

8

Sembra che tu sia bloccato con quel codice, ma se è così, questo sembra un buon momento per scrivere un metodo di estensione, in questo modo puoi rendere il tuo codice più chiaro e non 't hanno a ripetere che il codice in più posizioni, in modo da qualcosa come:

Module Extensions 
    <System.Runtime.CompilerServices.Extension()> _ 
    Public Function HoursAndMinutes(ByVal ts As TimeSpan) As String 
     Return If(ts < TimeSpan.Zero, "-", "") & ts.ToString("hh\:mm") 
    End Function 
End Module 

E poi si può solo chiamare come:

ts.HoursAndMinutes() 
+0

Questo potrebbe essere considerato un abuso di metodi di estensione con un formato specifico. – mattmc3

+0

@ mattmc3: Beh, probabilmente non scriverò uno come questi e inserirò una libreria generica, ma per rendere un progetto specifico più leggibile non mi preoccuperei di ciò. –

+0

Alla fine ho implementato questo come metodo di estensione, quindi grazie. Ha dato la risposta a Will dato che è stato il primo a confermare che non si poteva fare con la sola stringa di formato. Forse abusare di matt, ma quasi ogni casella di testo in questa app deve essere formattata in questo modo quindi penso che sia ok in questo caso. –

1

Il formato standard "c" fornisce il segno negativo, ma include tutte le parti del periodo.

Dim ts As New TimeSpan(-10, 1, 2) 
    Debug.WriteLine(ts.ToString("c")) 
1

sto usando questo codice fugly:

if (timeDiff.TotalSeconds < 0) 
      { 
       timeDiff = timeDiff.Negate(); 
       TimeChangeTb.Text = string.Format("-{0:D2}:{1:D2}:{2:D2}", 
       timeDiff.Hours, 
       timeDiff.Minutes, 
       timeDiff.Seconds); 
      } 
      else 
      { 
       TimeChangeTb.Text = string.Format("{0:D2}:{1:D2}:{2:D2}", 
       timeDiff.Hours, 
       timeDiff.Minutes, 
       timeDiff.Seconds); 
      } 

Speranza che aiuta!

0

Sulla base @ risposta HO1, ho costruito un metodo di estensione. Potrebbe essere un po 'più facile da usare al giorno d'oggi.

public static class TimeSpanUtil 
{ 
    public static string HoursAndMinutes(this TimeSpan ts) 
    { 
     return (ts < TimeSpan.Zero ? "-" : "") + ts.ToString("hh:mm");  
    }   
} 
Problemi correlati