2017-02-26 16 views
1

Ich habe einen int, die speichert, wie viele Sekunden ich auf einem Timer verlassen haben, was ich will, ist, dass Format auf eine schöne Zeit tun konvertieren, so zum BeispielConvert int in schönes Zeitformat?

Wenn der Timer war 604:

"10 minutes and 4 seconds" 

Wenn der Timer war 2942

"49 minutes and 2 seconds" 

Wenn der Timer 61

"1 minute and 1 second" 
war 0

Gibt es eine einfache Möglichkeit, dies zu tun, außer viele If-Checks auszuführen, um sie zu konvertieren?

Antwort

1

Das NuGet Paket Humanizer konzipiert für Termine für Menschen lesbaren Zeichenketten zu erstellen, Zeiten etc. Insbesondere eine TimeSpan in eine humanisierte Zeichenfolge umwandeln kann.

Wenn Sie oben in Ihrer Quelldatei using Humanizer; hinzufügen, wird eine Erweiterungsmethode zu TimeSpan hinzugefügt, die die Intervalle genau nach Ihren Wünschen zurückgibt. Z.B.

TimeSpan.FromSeconds(604).Humanize(precision: 2, collectionSeparator: " and ") 

kehrt

 
10 minutes and 4 seconds 

Humanizer Pluralisierung Griffe (natürlich):

TimeSpan.FromSeconds(61).Humanize(precision: 2, collectionSeparator: " and ") 

kehrt

 
1 minute and 1 second 

Humanizer können Sie die Formatierung in vielerlei Hinsicht optimieren und das Paket auch unterstützt mehrere Sprachen.

3
TimeSpan t = TimeSpan.FromSeconds(604); 
string nicelyFormatted = string.Format("{0:D2} minutes and {1:D2} seconds and {2:D3} miliseconds", 
    t.Minutes, 
    t.Seconds, 
    t.Milliseconds); 

Ich habe die Millisekunden auch wenn Sie es brauchen. Die D2 bedeutet 2 Ziffern, so können Sie setzen, was Sie bevorzugen.

+0

Aber dies wird immer Minuten, Sekunden und ms enthalten, ich will es nur zeigen, was benötigt wird, wenn Sekunden <60 dann seine 0 Minuten, also nur Sekunden und ms zeigen. – Ashkru

+0

@Ashkru schreibe eine if-Anweisung: 'if (Zahl <= 60) {schönFormatted = Zeichenkette.Format (" {0: D2} Sekunden und {1: D3} Millisekunden ", t.Sekunden, t.Millisekunden);}' – CodingYoshi

+0

Ignoriert die Millisekunden, dann für 61 Sekunden die resultierende Zeichenfolge wird "1 Minuten und 1 Sekunden". Das gewünschte Ergebnis ist jedoch "1 Minute und 1 Sekunde" (keine Pluralisierung). –

1

Gibt es eine einfache Möglichkeit, dies zu tun, außer viele If-Checks zu laufen, um es zu konvertieren?

Nein, leider müssen Sie codieren.

Aber ich denke, der Code unten wird Ihren Bedarf erfüllen.

public static void TimeFormat(StringBuilder format, string name, ref int delta, int time) 
{ 
    if (delta >= time) 
    { 
     if (format.Length > 0) 
      format.Append(" and "); 

     format.Append(delta/time).Append(" ").Append(name).Append((delta >= time * 2 ? "s" : "")); 
     delta %= time; 
    } 
} 

public static string NiceTimeFormat(int seconds) 
{ 
    StringBuilder format = new StringBuilder(); 

    const int second = 1; 
    const int minute = 60 * second; 
    const int hour = 60 * minute; 
    const int day = 24 * hour; 
    const int month = 30 * day; 
    const int year = 365 * day; 

    int delta = seconds; 

    TimeFormat(format, "year", ref delta, year); 
    TimeFormat(format, "month", ref delta, month); 
    TimeFormat(format, "day", ref delta, day); 
    TimeFormat(format, "hour", ref delta, hour); 
    TimeFormat(format, "minute", ref delta, minute); 
    TimeFormat(format, "second", ref delta, second); 

    return format.ToString(); 
} 

es zu benutzen:

NiceTimeFormat(604); 
NiceTimeFormat(2942); 
NiceTimeFormat(61);