【问题标题】:C# Timespan - User defined customer format specifierC# Timespan - 用户定义的客户格式说明符
【发布时间】:2021-05-08 10:53:59
【问题描述】:

有什么方法可以用我自己的新格式说明符扩展时间跨度自定义格式说明符(请参阅下面的文档 URL)?

文档网址:https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-timespan-format-strings

也许像 'ww' 来显示“总分钟数”

var myTimeSpan = new TimeSpan(1, 20, 10);
Console.Writeline(myTimeSpan.ToString("ww:ss"));

上述代码的预期结果是:

80:10

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    您必须为ICustomFormatter 创建一个实现。当您转换为字符串时,您必须提供该实现。需要注意的是,简单地调用 ToString overload on the TimeSpan that accepts an IFormatProvider 是行不通的,因为它总是需要一个 DateTimeFormatInfo 实例。

    这是一个 CustomFormatter,可以满足您的需求:

    class TotalMinutesFormatter:ICustomFormatter, IFormatProvider
    {
        // IFormatProvider.GetFormat 
        public object GetFormat(Type formatType)
        {
            //return ourself
            if (formatType == typeof(ICustomFormatter))
                return this;
            else
                return null;
        }
        
        // ICustomFormatter.Format fmt will have ww:ss and value will be the TimeSpan
        public string Format(string fmt, object value, IFormatProvider fp)
        {
          if (value is TimeSpan) {
             var ts = (TimeSpan) value;
             var sb = new StringBuilder();
             switch(fmt)
             {
                case "ww:ss":
                    // calc minutes
                    var minutes = ts.Hours*60+ts.Minutes;
                    sb.AppendFormat("{0:00}:{1:00}", minutes, ts.Seconds);
                    break;
                default:
                    // non recognized format
                    sb.AppendFormat(fmt,value);
                break;
             }
             return sb.ToString(); // the TimeSpan as string
          }
          // default fallback
          return String.Format(fmt,value);
        }
    }
    

    以下是您需要如何使用格式化程序:

    var myTimeSpan = new TimeSpan(1, 20, 10);
    Console.WriteLine(String.Format(new TotalMinutesFormatter(), "{0:ww:ss}", myTimeSpan));
    

    同样,myTimeSpan.ToString("ww:ss", new TotalMinutesFormatter()) 将不起作用并导致 FormatException:

    输入的字符串格式不正确

    如果您提供了一个 CustomFormatter,TimeSpan.ToString 的内部实现不支持。

    【讨论】:

    • 嗨勒内。谢谢你的详细回答。使用 ICustomFormatter 似乎是最接近的。但是,它不会完全达到目的,因为 ToString() 不起作用,我相信这也不能在 XAML 中使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多