首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >String.Format和DateTimeFormatInfo是可插拔/可扩展的吗?

String.Format和DateTimeFormatInfo是可插拔/可扩展的吗?
EN

Stack Overflow用户
提问于 2010-10-13 09:12:26
回答 2查看 267关注 0票数 1

例如,假设当我在string.format中使用字符串"or“时,我想将其转换为日期的序数值。

代码语言:javascript
复制
string.Format("{0:ddor MMM yyyy}.", DateTime.Now)

应该输出

代码语言:javascript
复制
1st Jan 2010

有关如何导出序数的信息,请参阅以下内容

Is there an easy way in .NET to get "st", "nd", "rd" and "th" endings for numbers?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-13 09:43:32

似乎没有类似的东西。

最推荐的方法是:

代码语言:javascript
复制
var d = DateTime.Now;
var result2 = String.Format("{0:dd}{1} {2:MMM yyyy}", d, Ordinal(d.Day), d);

一种非常老套的方法是创建一个自定义的IFormatProvider。可能会有很多麻烦,但为了展示另一种方法...(我对此没有太多经验,可能不是很“正确”)

代码语言:javascript
复制
using System;

namespace Test
{
    class Program
    {
        public static string Ordinal(int number)
        {
            string suffix = String.Empty;

            int ones = number % 10;
            int tens = (int)Math.Floor(number / 10M) % 10;

            if (tens == 1)
            {
                suffix = @"\t\h";
            }
            else
            {
                switch (ones)
                {
                    case 1:
                        suffix = @"\s\t";
                        break;

                    case 2:
                        suffix = @"\n\d";
                        break;

                    case 3:
                        suffix = @"\r\d";
                        break;

                    default:
                        suffix = @"\t\h";
                        break;
                }
            }
            return suffix;
        }

        public class MyFormat : IFormatProvider, ICustomFormatter
        {
            public object GetFormat(Type formatType)
            {
                return (formatType == typeof(ICustomFormatter)) ? this : null;

            }

            public string Format(string format, object arg, IFormatProvider formatProvider)
            {
                var d = (DateTime)arg;

                var or = Ordinal(d.Day);

                format = format.Replace("or", or);

                return d.ToString(format);
            }
        }
        static void Main(string[] args)
        {
            var result = String.Format(new MyFormat(), "{0:ddor MMM yyyy}.", DateTime.Now);

            return;
        }
    }
}

More info on Custom IFormatProvider

票数 2
EN

Stack Overflow用户

发布于 2010-10-13 10:10:26

格式提供程序是可插拔的,但据我所知,您不能为给定类型设置默认格式提供程序。按照约定接受格式字符串的方法通常也有一个接受IFormatProvider的重载。您可以实现两个类,如MyFormatProvider:IFormatProvider和MyCustomFormatter:ICustomFormatter

当处理诸如"{0:dd}{0:or} {0:MMM} {0:yyyy}“这样的格式字符串时,您的ICustomFormatter将被调用4次,参数为"dd”、"or“、"MMM”和"yyyy“,以便可以分别对每个部分进行格式化。您只需处理“或”的情况,并将其余部分传递给默认格式提供程序。

但是,调用方在格式化时仍需要传入自定义格式提供程序的实例。例如:

代码语言:javascript
复制
string str = String.Format(MyFormatProvider.Default, "{0:dd}{0:or} {0:MMM} {0:yyyy}", date);

据我所知,这是无法逃脱的要求。当我创建了一个显示DateTimes的“相对”DateTime格式字符串时,我寻找了一种更好的方法,比如"1小时前“、"3天前”等等。我想不出一种方法来避免显式地传递我的自定义IFormatProvider。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3920164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档