5

次の2行のコードがあります。

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

一方、BadResultは明らかに悪いものであり、GoodResultは良いものです。私のCustomFormatterクラスは次のように宣言されています:(また、私が関連していると感じる1つの関数を使用して):

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

編集OK、私はそれを手に入れたと思います。現在の 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 に答える