2017-03-06 41 views
2

我正在寫這個問題,因爲我正在尋求最好的方法來做到這一點。我在我的程序中有很多這樣的內容,我想要製作一個方法來將包含一個定時器的Int32的Int32轉換爲格式良好的字符串。C#:實現格式良好的時間字符串的最佳方法?

因此,舉例來說,如果我的定時器INT是在讓我們說像16429 一個隨機數,這將是:

4 hours, 32 minutes and 9 seconds 

如果是600,這將是:

10 minutes 

如果它是60,這將是

1 minute 

如果是172801,這將是

2 days and 1 second 

如果是32,這將是

32 seconds 

我想要的「S」型的,在像‘分’每個單詞的結尾,‘第二’和‘天’,只如果它不等於1,則放S,因此它不是真的需要正確發音。如果需要的話,我還只需要幾天和幾小時以及其他東西,所以如果定時器在幾秒鐘之內就不到1天,它只會顯示幾小時,幾分鐘和幾秒鐘,或者需要什麼。

達到這樣的最佳方式是什麼?我有這個功能,下面,但它是非常混亂的,只有上升到分和秒,而不是幾小時或幾天:

public static string GetConvertedTime(int timer) 
{ 
    int Minutes = timer/60; 
    int Seconds = timer - Minutes * 60; 

    if (timer < 60) 
    { 
     string secs = (Seconds != 1) ? "s" : ""; 
     return "" + timer + " second" + secs; 
    } 

    else 
    { 
     if (Seconds < 1) 
     { 
      string mins = (Minutes != 1) ? "s" : ""; 
      return "" + Minutes + " minute" + mins; 
     } 
     else 
     { 
      string mins = (Minutes != 1) ? "s" : ""; 
      string secs = (Seconds != 1) ? "s" : ""; 
      return "" + Minutes + " minute" + mins + " and " + Seconds + " second" + secs; 
     } 
    } 
} 

到底是什麼做到這一點的最好方法是什麼?

回答

2

你可以嘗試Humanizer

+0

鏈路只有答案不是非常有用 –

+1

@Buhbuh,確定他們是什麼你會期待在答案中,來自github的完整源代碼?知道產品存在是有用的,有一個鏈接到它甚至更好 – pm100

+2

@ pm100我認爲一個合理的期望是顯示如何完成使用該庫的任務。 「試試這個圖書館」不僅僅是一個答案,而是一個評論。 –

3

也許我能想到的最好的辦法是使用TimeSpan像這樣這個庫命名爲:

var time = new TimeSpan(0, 0, timer); 
var s = "s"; 
return $"{time.Days} day{(time.Days != 1 ? s : String.Empty)}, {time.Hours} hour{(time.Hours != 1 ? s : String.Empty)}, {time.Minutes} minute{(time.Minutes != 1 ? s : String.Empty)}, and {time.Seconds} second{(time.Seconds != 1 ? s : String.Empty)}"; 

,如果你需要隱藏空的主導價值觀:

var sb = new StringBuilder(); 
var s = "s"; 
var time = new TimeSpan(0, 0, timer); 
var continuation = false; 
if (time.Days > 0) 
{ 
    sb.Append($"{time.Days} day{(time.Days != 1 ? s : String.Empty)}, "); 
    continuation = true; 
} 
if (time.Hours > 0 || continuation) 
{ 
    sb.Append($"{time.Hours} hour{(time.Hours != 1 ? s : String.Empty)}, "); 
    continuation = true; 
} 
if (time.Minutes > 0 || continuation) 
{ 
    sb.Append($"{time.Minutes} minute{(time.Minutes != 1 ? s : String.Empty)}{(continuation ? "," : String.Empty)} "); 
    continuation = true; 
} 
if (continuation) sb.Append("and "); 

sb.Append($"{time.Seconds} second{(time.Seconds != 1 ? s : String.Empty)}"); 
return sb.ToString(); 
3

「最好的方式」是非常主觀的。 DRY通常是最好的,考慮到本地化和非正規的多元化形式通常是最好的,保持短期和活潑的通常是最好的:

public static string FriendlyDuration(int seconds) { 
    int[] divisors = { 60 * 60 * 24, 60 * 60, 60 , 1}; 
    string[] language = { ", ", " and ", "days", "day", "hours", "hour", "minutes", "minute", "seconds", "second"}; 
    var parts = new List<string>(); 
    for (int part = 0; part < divisors.Length; ++part) { 
     int count = seconds/divisors[part]; 
     if (count == 0) continue; 
     string unit = language[part*2 + (count == 1 ? 3 : 2)]; 
     parts.Add(string.Format("{0} {1}", count, unit)); 
     seconds -= count * divisors[part]; 
    } 
    var result = string.Join(language[0], parts.ToArray()); 
    if (parts.Count > 1) { 
     var ix = result.LastIndexOf(language[0]); 
     result = result.Substring(0, ix) + language[1] + result.Substring(ix + language[0].Length); 
    } 
    return result; 
} 
+0

這看起來像是我希望在經過多年的體驗後可以編寫的那種代碼,+1 – Ceshion

相關問題