String.Format与int.ToString关于iCustomFormatter问题
本文关键字:关于 iCustomFormatter 问题 ToString int Format String | 更新日期: 2023-09-27 18:28:58
我有以下两行代码:
var BadResult = (100).ToString("B", new CustomFormatter ());
var GoodResult = String.Format("{0}", 100, new CustomFormatter ());
然而,BadResult显然是坏的,GoodResult是好的。我的CustomFormatter类是这样声明的:(还有一个我觉得相关的函数):
public class CustomFormatter
: IFormatProvider, ICustomFormatter
{
public virtual Object GetFormat(Type formatType)
{
String formatTypeName = formatType.ToString();
formatTypeName = formatTypeName;
Object formatter = null;
if (formatType == typeof(ICustomFormatter))
formatter = this;
return formatter;
}
}
问题本身是,当我运行具有"良好结果"的代码行时,GetFormat函数正在请求CustomFormatter的实例。
无论何时使用Float.Tostring()调用它,它都需要NumberFormatInfo的实例。
我最初跳到"我的CustomFormatter应该从NumberFormatInfo派生"。不幸的是,班级被封了。
所以:我需要做什么才能用自定义格式化程序调用Float.ToString()?
谢谢!
您的
var GoodResult = String.Format("{0}", 100, new CustomFormatter ());
未使用CustomFormatter。因此,您的良好结果似乎是通过默认值实现的。
你想要的可能是:
var GoodResult = String.Format(new CustomFormatter (), "{0}", 100);
看看这是怎么回事。
我不确定你是否可以使用Number.ToString的自定义格式化程序。我看到的所有自定义格式化程序的例子都使用String.Format(例如MSDN上的)。
我建议你尝试一种扩展方法:
public static class MyExt
{
public static string ToFormattedString(this float This, string format, IFormatProvider provider)
{
return String.Format(provider,"{0}", new object[] {This});
}
}
//now this works
var NoLongerBadResult = (100F).ToFormattedString("B", new CustomFormatter ());
编辑好的,我想我得到了。你需要更改当前的NumberFormatInfo并从GetFormat:返回
public class CustomFormatter : IFormatProvider, ICustomFormatter
{
public object GetFormat(Type formatType)
{
if (formatType == typeof(ICustomFormatter))
return this;
else if(formatType == typeof(NumberFormatInfo))
{
NumberFormatInfo nfi = (NumberFormatInfo)NumberFormatInfo.CurrentInfo.Clone(); // create a copy of the current NumberFormatInfo
nfi.CurrencySymbol = "Foo"; // change the currency symbol to "Foo" (for instance)
return nfi; // and return our clone
}
else
return null;
}
public string Format(string fmt, object arg, IFormatProvider formatProvider)
{
return "test";
}
}
现在这个工作:
var NowItWorks = (100).ToString("C", new CustomFormatter ());
var GoodResult = String.Format(new CustomFormatter (),"{0}", 100);
Console.WriteLine(NowItWorks); // Foo 100.00
Console.WriteLine(GoodResult); // test