2014-06-05 8 views
5

Chcę sformatować wpisany w czasie określonym standardzie:FormatException z TryParseExact

private String CheckTime(String value) 
{ 
    String[] formats = { "HH mm", "HHmm", "HH:mm", "H mm", "Hmm", "H:mm", "H" }; 
    DateTime expexteddate; 
    if (DateTime.TryParseExact(value, formats, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out expexteddate)) 
     return expexteddate.ToString("HH:mm"); 
    else 
     throw new Exception(String.Format("Not valid time inserted, enter time like: {0}HHmm", Environment.NewLine)); 
} 

Gdy użytkownik wpisze to jak: "09 00", "0900", "09:00", „9 00 "," 9:00 "
Ale gdy użytkownik wpisze takie hasło jak: "900" lub "9" system nie sformatuje go, dlaczego? Są to domyślne formaty, których nauczyłem się.

string str = CheckTime("09:00"); // works 
str = CheckTime("900");   // FormatException at TryParseExact 
+0

H zastępczy można dopasować dwie cyfry, a także niezbędne do analizowania godzin> = 10. Więc 900 mecze Hmm z H = 90. Kaboom. –

+0

@HansPassant: ale '90' to'> 24', więc nie trzeba traktować pierwszych dwóch cyfr jako godzin. Czy to ograniczenie "TryParseExact"? Zakładam, że jest to w jakiś sposób związane z moim własnym pytaniem, które ostatnio zadałem: http://stackoverflow.com/questions/21902722/datetime-parseexact-with-7-digits-one-or-two-digit-month –

+0

Po raz pierwszy Widzę to pytanie, natychmiast przyszło mi do głowy także @TimSchmelter [pytanie] (http://stackoverflow.com/q/21902722/447156). Moim zdaniem metody parsowania nie wiedzą, co robią w takim przypadki .. –

Odpowiedz

1

Hmm mecze "0900" i H mecze "09" musisz podać 2 cyfry.

Można tylko zmienić dane wprowadzone przez użytkownika w ten sposób:

private String CheckTime(String value) 
{ 
    // change user input into valid format 
    if(System.Text.RegularExpressions.Regex.IsMatch(value, "(^\\d$)|(^\\d{3}$)")) 
     value = "0"+value; 

    String[] formats = { "HH mm", "HHmm", "HH:mm", "H mm", "Hmm", "H:mm", "H" }; 
    DateTime expexteddate; 
    if (DateTime.TryParseExact(value, formats, System.Globalization.CultureInfo.InvariantCulture,  System.Globalization.DateTimeStyles.None, out expexteddate)) 
     return expexteddate.ToString("HH:mm"); 
    else 
     throw new Exception(String.Format("Not valid time inserted, enter time like:  {0}HHmm", Environment.NewLine)); 
} 
+0

Cóż, to załatwiło sprawę :-) – Cageman

1

czas String = "900" .PadLeft (4, '0');

Powyższa linia zadba, jeśli wartość jest 0900,900,9 lub nawet 0;)

+0

Było to również możliwe do wykonania. Oddajcie głos ode mnie, ale odpowiedź Xeijpa naprawiła problem dla mnie w tym czasie. – Cageman

Powiązane problemy