2014-06-05 4 views
5

Ich möchte in der Zeit zu einem bestimmten Standard eingegeben zu formatieren:Format mit 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)); 
} 

Wenn der Benutzer mag es: "09 00", "0900", "9.00", „9 00 "," 9:00 "
Aber wenn der Benutzer es wie folgt eingibt: "900" oder "9" das System schlägt fehl, es zu formatieren, warum? Sie sind Standardformate, die ich gelernt habe.

+0

Der H-Platzhalter können auch zwei Ziffern entsprechen, erforderlich Stunden> = 10. Also 900 Matches Hmm mit H zu analysieren = 90. Kaboom. –

+0

@HansPassant: aber '90' ist'> 24', so dass die ersten beiden Ziffern nicht als Stunden behandelt werden müssen. Ist das eine Einschränkung von 'TryParseExact'? Ich nehme an, dass dies irgendwie mit meiner eigenen Frage verbunden ist, die ich kürzlich gefragt habe: http://stackoverflow.com/questions/21902722/datetime-parseexact-with-7-digits-one-oder-two-digit-month –

+0

Zum ersten Mal Ich sehe diese Frage, sofort kam mir @TimSchmelter [http://stackoverflow.com/q/21902722/447156] auch in den Sinn. Meiner Meinung nach wissen Parsing-Methoden nicht, was sie in so einem tun Fälle .. –

Antwort

1

Hmm passt "0900" und H passt "09" Sie müssen 2 Ziffern geben.

Sie können nur Benutzereingaben ändern, um diese Art und Weise:

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

gut das hat den Trick :-) – Cageman

1

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

Above Linie kümmern, wenn der Wert 0900,900,9 oder sogar 0;)

+0

Dies war auch eine Möglichkeit zu tun. Up Abstimmung von mir, aber Xeijp Antwort behoben das Problem für mich zu dieser Zeit. – Cageman