C#字符串格式,从小数点开始,以小时和分钟为单位

问题描述

| 是否有一种简单的字符串格式,可以用小数点表示小时和小时的小数,并显示为小时和分钟? 例如:5.5格式化为显示5小时30分钟。 我很高兴自己编写代码,但是希望使用现有功能(如果可用)     

解决方法

decimal t = 5.5M;
Console.WriteLine(TimeSpan.FromHours((double)t).ToString());
这会给您“ 05: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;
}
    ,如果您的时间可能超过24小时,则必须考虑TimeSpan类具有Days属性,并且Hours属性将循环。这样可以防止超过24小时的时间出现任何错误:
 var tsExample = TimeSpan.FromHours(timeInDecimal);
 var result = $\"{tsExample.Hours + (tsExample.Days * 24):00}:{tsExample.Minutes:00}\";