String.format和DateTimeFormatinfo是否可插入/可扩展?
-
29-09-2019 - |
题
因此,例如,当我字符串时,让我们说日期并使用字符串“或”格式模式,我希望将其转换为日期的顺序值。
IE
string.Format("{0:ddor MMM yyyy}.", DateTime.Now)
应该输出
1st Jan 2010
有关如何得出顺序数字,请参见下文
解决方案
似乎没有类似的东西。
最建议的方法:
var d = DateTime.Now;
var result2 = String.Format("{0:dd}{1} {2:MMM yyyy}", d, Ordinal(d.Day), d);
实现它的一种非常骇人听闻的方法是创建一个自定义 IFormatProvider
. 。 IMO只是很多麻烦,但是只是要展示另一种方法...(我对此没有太多经验,这可能不是很“正确”)
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;
}
}
}
其他提示
格式提供商可以插入,但据我所知,您无法为给定类型设置默认格式提供商。通过惯例采用格式字符串的方法通常也具有接管iFormatProvider的过载。您可以实现两个类,例如MyFormatProvider: iformatProvider 和mycustomformatter: icustomformatter.
处理格式字符串,例如“ {0:dd} {0:or} {0:mmm} {0:yyyy}”时,您的icustomformatter将被称为4次,用“ dd”,“”或“,”,“ mmm”称为“和“ yyyy”作为参数,因此可以分别格式化每个部分。您只需处理“或”案例,然后将其余的案件传递到默认格式提供商。
但是,格式化时,呼叫者仍需要在您的自定义格式提供商的情况下通过。例如:
string str = String.Format(MyFormatProvider.Default, "{0:dd}{0:or} {0:MMM} {0:yyyy}", date);
据我所知,这一要求没有逃脱。当我创建了一个“相对”的DateTime格式字符串时,我搜索了一种更好的方式传递我的自定义IFORMATPROVIDER。
不隶属于 StackOverflow