是否有一個簡單的字符串格式,它將採用十進制表示小時和小時分數並將其顯示爲小時和分鐘?C#字符串十進制小時和分鐘的格式
例如:5.5格式化爲顯示5小時30分鐘。
我很高興地編寫代碼自己,但寧願使用現有的功能,如果它是可用
是否有一個簡單的字符串格式,它將採用十進制表示小時和小時分數並將其顯示爲小時和分鐘?C#字符串十進制小時和分鐘的格式
例如:5.5格式化爲顯示5小時30分鐘。
我很高興地編寫代碼自己,但寧願使用現有的功能,如果它是可用
decimal t = 5.5M;
Console.WriteLine(TimeSpan.FromHours((double)t).ToString());
這會給你「5時30分00秒」,這是相當接近。然後,您可以格式化你想要的結果:
var ts = TimeSpan.FromHours((double)t);
Console.WriteLine("{0} hrs {1} minutes", ts.Hours, ts.Minutes);
注意,有在從十進制到兩倍的轉換精度的損失潛力,但我不認爲這將是對分鐘刻度明顯。對類型系統有類似Skeet的理解的人可能會在這裏發出響聲。
我根據Matt的評論爲此寫了一些小幫手方法。可能對某個人有用,以免你自己寫。
/// <summary>Converts a decimal e.g. 1.5 to 1 hour 30 minutes</summary>
/// <param name="duration">The time to convert as a double</param>
/// <returns>
/// Returns a string in format:
/// x hours x minutes
/// x hours (if there's no minutes)
/// x minutes (if there's no hours)
/// Will also pluralise the words if required e.g. 1 hour or 3 hours
/// </returns>
public String convertDecimalToHoursMinutes(double time)
{
TimeSpan timespan = TimeSpan.FromHours(time);
int hours = timespan.Hours;
int mins = timespan.Minutes;
// Convert to hours and minutes
String hourString = (hours > 0) ? string.Format("{0} " + pluraliseTime(hours, "hour"), hours) : "";
String minString = (mins > 0) ? string.Format("{0} " + pluraliseTime(mins, "minute"), mins) : "";
// Add a space between the hours and minutes if necessary
return (hours > 0 && mins > 0) ? hourString + " " + minString : hourString + minString;
}
/// <summary>Pluralise hour or minutes based on the amount of time</summary>
/// <param name="num">The number of hours or minutes</param>
/// <param name="word">The word to pluralise e.g. "hour" or "minute"</param>
/// <returns> Returns correct English pluralisation e.g. 3 hours, 1 minute, 0 minutes</returns>
public String pluraliseTime(int num, String word)
{
return (num == 0 || num > 1) ? word + "s" : word;
}
將不起作用。 – Matthieu 2017-10-17 18:19:40
如果您的時間可能超過24小時,您必須考慮TimeSpan類具有Days屬性,並且Hours屬性將循環。這樣的事情將防止超過24小時的任何錯誤:
var tsExample = TimeSpan.FromHours(timeInDecimal);
var result = $"{tsExample.Hours + (tsExample.Days * 24):00}:{tsExample.Minutes:00}";
不錯,我沒想到使用TimeSpan(我可能應該有但:))。我添加了一些格式來隱藏分鐘,如果它們是0:string.Format(「{0} hrs {1}」,ts.Hours,ts.Minutes> 0?string.Format(「{0}」,ts 。分鐘) : 」」); – johnc 2011-05-02 00:09:07
是的好主意。我也曾在Reporting Services報告中使用TimeSpan,以獲得人類可讀的時間跨度。這是一個很棒的伎倆。 – 2011-05-02 00:13:53
如果您的時間跨度超過24小時,則應避免使用第二個示例。如果時間> 24小時, – Matthieu 2017-10-17 17:43:53