我的代码如下两行:的String.Format VS int.ToString的问候iCustomFormatter问题
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功能requestng CustomFormatter的一个实例。
每当使用Float.Tostring()调用它时,它的期望NumberFormatInfo的一个实例。
我最初跳到“我的CustomFormatter应该从NumberFormatInfo派生”。不幸的是,这个班是封闭的。
因此:我需要做什么才能用自定义格式化程序调用Float.ToString()?
谢谢!
从我的互联网侦探工作中,这似乎开始看起来像解决方案。然而,为什么地狱是一个float.tostring()重载,允许你给一个icustomformatter? – greggorob64 2012-03-26 14:31:32
@ greggorob64你是对的,它应该是可能的。 [Single.ToString](http://msdn.microsoft.com/en-us/library/6dx8etks.aspx)的文档说“提供者参数是一个IFormatProvider实现,它的GetFormat方法返回一个NumberFormatInfo对象”,所以它看起来应该有一种方法来创建一个NumberFormatInfo对象并从您的自定义getformat中返回它。尽管...我还没有找到办法做到这一点但我仍然在尝试 – 2012-03-26 14:43:26
@ greggorob64 ok,所以...您的自定义提供程序工作正常,但是如果您将其与Number.Tostring一起使用,您只能使用NumberFormatProvider可以理解的格式,因此B不起作用(但如果您尝试'(100).ToString(“C”,新的CustomFormatter());'它的工作原理和100被格式化为货币)。例如,您可能会返回一个自定义的NumberFormatProvider,您可以在其中更改小数点的符号,但是您只能使用NumberFormatInfo自身允许您自定义的更改类型 – 2012-03-26 14:52:38