string.Format不在服务器上应用自定义格式

时间:2014-02-12 11:03:11

标签: c# cultureinfo timespan string.format

我正在做下面的事情:

//TimeSpan rebateTime
//int percentage
string text = string.Format(
    CultureInfo.CurrentCulture, 
    "Rebate {0}% during {1:hh} h {1:mm} min", 
    percentage, 
    rebateTime;

在我的开发者文本中包含:

Rebate 32% during 05 h 00 min

在我的开发测试服务器上,文本包含:

Rebate 32% during 05 h 00 min

在我的共享测试服务器上,文本包含:

Rebate 32% during 05:00:00 h 05:00:00 min

这怎么可能呢?

3 个答案:

答案 0 :(得分:0)

我在这里转载了你的错误。

此格式仅适用于.NET 4.可能.NET 4未安装在共享服务器中。

查看TimeSpan Structure MSDN docs格式化TimeSpan值部分。

要检查这一点,请创建一个简单的控制台项目:

    static void Main(string[] args)
    {
        Console.WriteLine(String.Format(CultureInfo.CurrentCulture, "Rebate {0}% during {1:hh} h {1:mm} min", 0.15, new TimeSpan(DateTime.Now.Ticks)));
        Console.ReadKey();
    }

输出:

.NET 4

"Rebate 0.15% during 11 h e 47 min"

.NET 3.5

"Rebate 0,15% during 735275.11:48:48.7362198 h 735275.11:48:48.7362198 min"

答案 1 :(得分:0)

正如其他人所指出的那样,TimeSpan在.NET 4之前没有自定义格式。但是,备用解决方案并不复杂:

string.Format
(
    "Rebate {0}% during {1:##} h {2:##} min", 
    percentage, 
    rebateTime.TotalHours, 
    rebateTime.Minutes
);

答案 2 :(得分:0)

碰巧我今天遇到了完全相同的问题。 我通过使用扩展方法修复它:

    public static string ToReadableString(this TimeSpan span)
    {
        string formatted = string.Format("{0}{1}{2}{3}",
            span.Duration().Days > 0 ? string.Format("{0:0} day{1}, ", span.Days, span.Days == 1 ? String.Empty : "s") : string.Empty,
            span.Duration().Hours > 0 ? string.Format("{0:00} hour{1}, ", span.Hours, span.Hours == 1 ? String.Empty : "s") : string.Empty,
            span.Duration().Minutes > 0 ? string.Format("{0:00} minute{1}, ", span.Minutes, span.Minutes == 1 ? String.Empty : "s") : string.Empty,
            span.Duration().Seconds > 0 ? string.Format("{0:00} second{1}", span.Seconds, span.Seconds == 1 ? String.Empty : "s") : string.Empty);

        if (formatted.EndsWith(", ")) formatted = formatted.Substring(0, formatted.Length - 2);

        if (string.IsNullOrEmpty(formatted)) formatted = "0 seconds";

        return formatted;
    }

当它在时间跨度上使用时,你会得到以下格式的时间(x天x小时x分钟x秒),只要有什么东西不可用,它就会被隐藏。