5

我有以下两行代码:

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()

谢谢!

4

2 回答 2

3

您的

 var GoodResult = String.Format("{0}", 100, new CustomFormatter ());

没有使用 CustomFormatter。所以你的好结果似乎是通过默认值实现的。

你想要的可能是:

 var GoodResult = String.Format(new CustomFormatter (), "{0}", 100);

看看它是如何工作的。

于 2012-03-26T14:00:31.587 回答
1

我不确定您是否可以将自定义格式化程序与 Number.ToString 一起使用。我在自定义格式化程序中看到的所有示例都使用 String.Format (例如MSDN 上的 this)。

我建议你尝试一种扩展方法:

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
于 2012-03-26T14:26:19.137 回答