2009-07-10 13 views
5

私はローマ数字に整数を出力したいと思っていましたが、thisの回答がJesse Slicerに流れました。これは、拡張メソッドであるが、私はフォーマットプロバイダーを書いたことがありませんFormatProviderと拡張メソッドの比較対新しいクラス

int a = 10; 
string b = a.ToString("RN", provider); 
// OR 
string c = string.Format(provider, "{0:RN} blah foo", a); 

代わりの

int a = 10; 
string b = a.ParseRomanNumeral(); 
// OR 
string c = string.Format("{0} blah foo", a.ParseRomanNumeral()); 

ような何かをするToString(string, IFormatProvider)を生かし疑問を抱いたので、私はわからないんだけど関係する仕事が、ここに私の質問です。ローマ数字のようないくつかの明確に定義されたフォーマット変換のために、あなたが使用します。

  • フォーマットプロバイダ
  • は、Parseを実装RomanNumeralクラスを記述TryParse、およびToString
  • 拡張メソッドを使用します
  • その他

なぜですか?

string.Format()とそのいとこのいずれかの方法(例えば、StringBuilder.AppendFormat())あなたの答えに影響を与えるを使用していますか?明らかに、拡張メソッドでは、これらの書式設定メソッドの1つを使用して変換にアクセスできませんでした。

私はガマット全体を実装するカスタムクラスが最も慎重であると同時に最も時間がかかると思います。カスタムフォーマットプロバイダを利用することは、既存のグローバリゼーション用のもの(もしあれば)の足元を歩くように思えます。

答えて

0

私はこの機能をどのように使用するかによって異なります。

IMO、拡張メソッドは良い方法です。 C#1または2(拡張メソッドをサポートしていない言語)で作業しているアセンブリのユーザーには、どのように表示されるのかはわかりません。

両方の方法で拡張されます。
数値型の場合 - 数値をRomanに変換する場合、
をstringに変換する場合 - Romanからnumberに変換する場合は、最大値に対応する数値型を考慮​​する必要があります。

+0

拡張メソッドは、String.Formatを使用する機能を無効にします。 –

+0

実際にはありません。しかし、コードの観点から文字列をローマ数字に変換するときに、フォーマットはどのように機能しますか? – shahkalpesh

+0

String.Formatは文字列から数値への変換ではありません(できません)。これが、私がRomanNumeralクラスがすべての用途を最も優雅にカバーしていると思う理由です。 –

1

フォーマットプロバイダは、独自の型ではうまく機能しますが、組み込み型を使用する場合は不便です。プロバイダのインスタンスを作成してFormatメソッドに渡す必要があるため、フォーマット指定子の利点がありません。 intに直接拡張メソッドを使用する方がはるかに便利です。

1

個人的には、上記のすべての理由の組み合わせ(shahkalpeshの答えに対する後者のコメントを含む)のために、tryparse、parse + tostring()、それをサポートする拡張メソッドを使ってローマ数字クラスを作成します。

関連する問題