2011-05-01 88 views
12

是否有一个简单的字符串格式,它将采用十进制表示小时和小时分数并将其显示为小时和分钟?C#字符串十进制小时和分钟的格式

例如:5.5格式化为显示5小时30分钟。

我很高兴地编写代码自己,但宁愿使用现有的功能,如果它是可用

回答

25
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的理解的人可能会在这里发出响声。

+1

不错,我没想到使用TimeSpan(我可能应该有但:))。我添加了一些格式来隐藏分钟,如果它们是0:string.Format(“{0} hrs {1}”,ts.Hours,ts.Minutes> 0?string.Format(“{0}”,ts 。分钟) : ””); – johnc 2011-05-02 00:09:07

+0

是的好主意。我也曾在Reporting Services报告中使用TimeSpan,以获得人类可读的时间跨度。这是一个很棒的伎俩。 – 2011-05-02 00:13:53

+0

如果您的时间跨度超过24小时,则应避免使用第二个示例。如果时间> 24小时, – Matthieu 2017-10-17 17:43:53

1

我根据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; 
} 
+0

将不起作用。 – Matthieu 2017-10-17 18:19:40

0

如果您的时间可能超过24小时,您必须考虑TimeSpan类具有Days属性,并且Hours属性将循环。这样的事情将防止超过24小时的任何错误:

var tsExample = TimeSpan.FromHours(timeInDecimal); 
var result = $"{tsExample.Hours + (tsExample.Days * 24):00}:{tsExample.Minutes:00}";