相关疑难解决方法(0)

如何为DateTime创建和使用自定义IFormatProvider?

我试图创建一个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) …

c# iformatprovider

20
推荐指数
2
解决办法
5万
查看次数

格式化字符串电话号码MVC Razor无需解析为十进制

我正在尝试格式化从我的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# asp.net-mvc string-formatting razor asp.net-mvc-4

5
推荐指数
1
解决办法
6357
查看次数

C#中的自定义字符串格式化

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# string string-formatting iformatprovider iformattable

5
推荐指数
1
解决办法
2522
查看次数

C#6 字符串插值 + 短格式字符串错误?

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)

为什么最后两行输出不同的结果?我错过了什么吗?

用 DotnetFiddle 试试

作为旁注,这里是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)

c# .net-core

5
推荐指数
1
解决办法
116
查看次数