2009-07-10 59 views
5

我想輸出一個整數爲羅馬數字,然後穿過Jesse Slicer的this答案。這是一個擴展方法,但我想知道關於採取的ToString(string, IFormatProvider)優勢做類似格式提供者與擴展方法與新類

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

我從來沒有寫過格式提供,所以我不知道的涉及的工作,但這是我的問題。 對於一些明確定義的格式轉換像羅馬數字,你會用:

  • 的格式提供
  • 使用擴展方法
  • 編寫實現ParseTryParse一個RomanNumeral類,並ToString
  • 別的東西

爲什麼?

是否使用string.Format()及其任何表親方法(例如StringBuilder.AppendFormat())會影響您的答案?顯然,使用擴展方法時,您無法使用這些格式化方法之一訪問轉換。

我認爲一個自定義類實現整個色域將是最審慎的,但也是最耗時的。使用自定義格式提供程序似乎會踩到一些現有全球化的東西(如果有的話)。

回答

0

我想這取決於你打算如何使用這個功能。

IMO,擴展方法是一個好方法。不確定,您的程序集用戶如何使用c#1或2(不支持擴展方法的語言)將會看到它。

兩種方式的擴展方法都不錯。
即數字類型 - 將數字轉換爲羅馬字符並將
轉換爲字符串 - 將羅馬轉換爲數字(您將不得不考慮數字類型,該數字類型應該包含最大值)。

+0

擴展方法否定使用String.Format的能力,是否正確? – 2009-07-10 19:05:57

1

格式提供商合作以及爲自己的類型,但他們在使用內建類型笨拙,因爲你必須創建提供程序的實例並將其傳遞給Format方法免去了格式說明的優勢。直接在int上使用擴展方法會更方便。

1

就個人而言,我會寫一個羅馬數字類,用的TryParse,解析+ toString()方法,以擴展方法來支持它,爲上述所有原因的綜合(包括您後者註釋shahkalpesh的答案。)