我试图创建一个IFormatProvider可以识别DateTime对象的自定义格式字符串的实现.这是我的实现:
public class MyDateFormatProvider : IFormatProvider, ICustomFormatter
{
public object GetFormat(Type formatType)
{
if (formatType == typeof(ICustomFormatter))
{
return this;
}
return null;
}
public string Format(string format, object arg, IFormatProvider formatProvider)
{
if(arg == null) throw new ArgumentNullException("arg");
if (arg.GetType() != typeof(DateTime)) return arg.ToString();
DateTime date = (DateTime)arg;
switch(format)
{
case "mycustomformat":
switch(CultureInfo.CurrentCulture.Name)
{
case "en-GB":
return date.ToString("ddd dd MMM");
default:
return date.ToString("ddd MMM dd");
}
default:
throw new FormatException();
}
}
Run Code Online (Sandbox Code Playgroud)
我希望能够在这样的DateTime.ToString(string format, IFormatProvider provider) …
我正在尝试格式化从我的viewModel循环的电话号码,如下所示:(###) ###-####无需将字符串解析为小数.
此方法给出Formatting is specified, but argument is not IFormattable错误:
@foreach (var client in Model.Clients)
{
<td>@String.Format("{0:(###) ###-####}", client.TelephoneNumber)</td>
}
Run Code Online (Sandbox Code Playgroud)
所以,我需要解析为小数:
@foreach (var client in Model.Clients)
{
<td>@String.Format("{0:(###) ###-####}", Decimal.Parse(client.TelephoneNumber))</td>
}
Run Code Online (Sandbox Code Playgroud)
但是无法保证循环的数字只是数字,因此最有可能至少一次解析尝试失败.
有没有办法实现这种格式,而无需解析为小数?
C#中的字符串格式;
我可以用吗?是.
我可以实现自定义格式吗?没有.
我需要写一些可以传递一组自定义格式选项的内容string.Format,这会对特定项目产生一些影响.
目前我有这样的事情:
string.Format("{0}", item);
Run Code Online (Sandbox Code Playgroud)
但我希望能够用这个项目做事:
string.Format("{0:lcase}", item); // lowercases the item
string.Format("{0:ucase}", item); // uppercases the item
string.Format("{0:nospace}", item); // removes spaces
Run Code Online (Sandbox Code Playgroud)
我知道我可以做类似的事情.ToUpper(),.ToLower()但我需要用字符串格式化来做.
我一直在研究类似的事情IFormatProvider,IFormattable但我不知道它们是否应该是我应该使用的东西,或者,如何实现它们.
任何人都可以解释我如何解决这个问题?
理由(以防万一你想知道...)
我有一个小程序,我可以在其中输入逗号分隔的值集和模板.项目将string.Format与创建输出的模板一起传递.我想提供模板格式化选项,以便用户可以控制他们想要输出项目的方式.
C# 6 引入了字符串插值和一种更短的方式来指定格式字符串。
IntPtr ptr = new IntPtr(0xff);
Console.WriteLine(ptr.ToString()); // 255
Console.WriteLine(ptr.ToString("x")); // ff
Console.WriteLine($"0x{ptr.ToString("x")}"); // 0xff
Console.WriteLine($"0x{ptr:x}"); //0x255
Run Code Online (Sandbox Code Playgroud)
为什么最后两行输出不同的结果?我错过了什么吗?
作为旁注,这里是dotnet core 中 IntPtr ToString()的源代码:
public unsafe String ToString(String format)
{
#if WIN32
return ((int)m_value).ToString(format, CultureInfo.InvariantCulture);
#else
return ((long)m_value).ToString(format, CultureInfo.InvariantCulture);
#endif
}
Run Code Online (Sandbox Code Playgroud)