2016-06-03 7 views
0

Benutzereingabe ist 555 Ich möchte es 05:55:00 (TimeSpan). Wie konvertiert man es in TimeSpan? Welches Format verwenden?Parsing 3-stellige Eingabe als TimeSpan

edit: In Details möchte ich Benutzer String Intput auf Stunden und Minuten formatieren hh: mm. ZB Benutzereingabestring:

  • "5" 05:00
  • "12" zu sein 12:00
  • "1111" sein zu 11:11
  • "0.12" zu seine 12:12
  • "4.44" sein 4:44
  • und man nicht "555" Arbeits 5.55 zu sein (wirft Ausnahme)

jetzt verwende ich:

private static string[] _foramts = {"%hmm", "hmm", "hhmm","%h", "hh\\:mm", "%h\\:mm" }; 
return TimeSpan.ParseExact((string)value, _foramts, CultureInfo.InvariantCulture).ToString("hh\\:mm"); 

mit PadLeft, jetzt gibt es keine Ausnahme, aber ....

var d = TimeSpan.ParseExact(((string)value).PadLeft(4, '0'), new string[] { "%hmm", "hmm", "hhmm", "%h", "hh\\:mm", "%h\\:mm" }, CultureInfo.InvariantCulture).ToString("hh\\:mm"); 

"5" ist jetzt 00.05 Uhr und ich möchte es 05:00

+0

Ich denke, Sie müssen es von Hand entweder tun, erhalten Sie die Eingabe als 'String' und tun Sie * Teilstring * oder verwenden Sie als' int' und tun einige '%' und '/' zu bekommen die Ziffern, die Sie benötigen. – Luiso

+0

Es ist bereits Zeichenfolge. Ich habe gerade eine Lösung gefunden, aber nicht nach Format. Machen Sie einfach: '.PadLeft (4, '0')' mit Benutzer-String-Eingabe. – gurth

+0

Das ist wirklich eine schlechte Methode, aber funktioniert: TimeSpan ts = TimeSpan.FromSeconds ((60 * (int) (int.Parse (Eingabe)/100)) + (int.Parse (Eingabe)% 100)); – jdweng

Antwort

0

ich sein nur Lösung gefunden, aber nicht nach Format. Machen Sie einfach: .PadLeft(4,'0') mit Benutzer-String-Eingabe. Noch bin ich neugierig, kann es mit Format gemacht werden?

edit: aber jetzt nicht wie erwartet:

var b = TimeSpan.ParseExact("5", new string[] { "%h" }, CultureInfo.InvariantCulture); 

Whit .PadLeft(4,'0') es Ausnahme wirft :(

+0

'var c = TimeSpan.ParseExact (" 5 ".PadLeft (4, '0'),"% hmm ", CultureInfo.InvariantCulture);' wird funktionieren. –

+0

Dodałem komentarz do głównego wątku. Po Twojej zmianie zamiast piątej godziny będę miał pięć po północy. :) Ich bearbeitete Hauptfrage, nach dieser Änderung Benutzer intpu "5" wird fünf Minuten nach Mitternacht nicht wie erwartet 5:00 Uhr am Morgen – gurth

0

Das Problem ist, dass H Format einer oder zwei Ziffern übereinstimmt, basierend auf der Anzahl der Ziffern In Ihrem Fall wird es die ersten zwei Ziffern "55" erfassen, die keine korrekte Stunde sind. Das Auffüllen mit Nullen ist der Weg, um das zu beheben:

var c = TimeSpan.ParseExact(value.PadLeft(4, '0'), new string[] { "%hmm", }, CultureInfo.InvariantCulture); 

Wenn Sie mit verschiedenen Formaten arbeiten möchten, wäre es einfacher, einfach-alte if-ens zu machen, die versuchen, alle möglichen Eingaben mit einem Muster abzugleichen.

public static TimeSpan Parse(string value) { 

    if (value.Length == 1) 
    { 
     value = value.PadLeft(2, '0'); 
     value = value.PadRight(4, '0'); 
    } 
    else if (value.Length == 2) 
    { 
     value = value.PadRight(4, '0'); 
    } 
    else if(value.Length == 3) 
    { 
     value = value.PadLeft(4, '0'); 
    } 

    return TimeSpan.ParseExact(value, new string[] { "%h\\:mm", "%hmm", "hmm", "hhmm" }, CultureInfo.InvariantCulture);//Exception! None format works. 
}