2012-09-22 8 views
9

Próbuję sformatować TimeSpan na ciąg. Następnie otrzymuję wygaśnięcie z MSDN w celu wygenerowania dostosowanego formatu ciągu znaków. Ale to nie słowa. Zwraca "FormatException".TimeSun ToString "[d.] Hh: mm"

Dlaczego? Nie rozumiem ...

var ts = new TimeSpan(0, 3, 25, 0); 
var myString = ts.ToString("[d'.']hh':'mm"); 

Odpowiedz

9

Uważam, że próbujesz zrobić coś takiego, jak opcjonalne części dnia i ułamkowe sekundy z c standard format. O ile wiem, nie jest to bezpośrednio możliwe w przypadku niestandardowych ciągów formatów. TimeSpan FormatString with optional hours to takie samo pytanie, jakie masz, i sugeruję coś podobnego do ich rozwiązania: stosuj metodę rozszerzenia, aby utworzyć dla ciebie ciąg formatu.

public static string ToMyFormat(this TimeSpan ts) 
{ 
    string format = ts.Days >= 1 ? "d'.'hh':'mm" : "hh':'mm"; 
    return ts.ToString(format); 
} 

Potem go używać:

var myString = ts.ToMyFormat(); 
+0

Tak, to zadziała na pewno. Ale używałbym formatu ToString. MSDN mówi, że mogę używać "[" i "]". Czy to prawda? – riofly

+0

Gdzie to mówi? Jedyne, co zauważyłem '[' i ']', to jak opisuje standardowe łańcuchy formatów, ale bez tego można faktycznie używać tych "magicznych" symboli w niestandardowych formatach. –

+0

Przepraszam, w rzeczywistości myliłem się. – riofly

3

Ten błąd zwykle występuje, gdy używasz symboli, które mają zdefiniowane znaczenia w ciągu formatującym. Najlepszym sposobem ich usunięcia jest selektywne usuwanie znaków, dopóki nie zadziała. Ostatnia postać, którą usunąłeś, była problematyczna.

W tym przypadku, patrząc na custom TimeSpan format strings, pojawiają się nawiasy kwadratowe. Ucieczka je z „\”, na przykład:

var ts = new TimeSpan(0, 3, 25, 0); 
var myString = ts.ToString("\\[d'.'\\]hh':'mm"); 

[Edit: dodano]

Nie sposób wymienić na klienta strona zwyczaj Okres ciągi formatu pominąć tekst, jeśli wartości 0. W tym przypadku , rozważ instrukcję if lub operatora ?:.

+0

Tak, wiem, że nawiasy kwadratowe są problemem. Ale wyglądam, że mogę użyć "[" i "]", aby zwrócić dni tylko wtedy, gdy wartość wynosi> = 0. Czy to możliwe? – riofly

+0

@riofly Wydaje się, że nie ma żadnego sposobu na pominięcie części ciągu, jeśli wartość wynosi 0 w http://msdn.microsoft.com/en-us/library/ee372287.aspx. Być może ah, jeśli wypowiedź jest lepsza. Odpowiedź została zaktualizowana. – akton