2014-06-05 12 views
5

voglio formattare un digitato in tempo per una norma specifica:FormatException con 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)); 
} 

Quando l'utente è del tipo: "09 00", "0900", "09:00", "9 00 "," 9:00 "
Ma quando l'utente lo digita come: "900" o "9" il sistema non riesce a formattarlo, perché? Sono formati predefiniti che ho insegnato.

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

Il segnaposto H può abbinare due cifre pure, necessario per analizzare ore> = 10. Così 900 partite Hmm con H = 90. Kaboom. –

+0

@HansPassant: ma '90' è'> 24', quindi non è necessario trattare le prime due cifre come ore. È una limitazione di 'TryParseExact'? Presumo che questo sia in qualche modo correlato alla mia stessa domanda che ho chiesto di recente: http://stackoverflow.com/questions/21902722/datetime-parseexact-with-7-digits-one-or-tue-digit-month –

+0

Prima volta Vedo questa domanda, immediatamente @TimSchmelter [domanda] (http://stackoverflow.com/q/21902722/447156) mi è venuta in mente .. Secondo me, i metodi di analisi non sanno cosa fanno in tale casi .. –

risposta

1

Hmm corrisponde a "0900" e H corrisponde a "09" devi fornire 2 cifre.

Si può solo cambiare l'input dell'utente in questo modo:

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

bene che ha fatto il trucco :-) – Cageman

1

tempo stringa = "900" .PadLeft (4, '0');

Sopra linea si prenderà cura, se il valore è 0900,900,9 o addirittura 0;)

+0

Questa era anche una possibilità di fare. Ho votato da me, ma la risposta di Xeijp mi ha risolto il problema in quel momento. – Cageman

Problemi correlati