2009-07-10 32 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的答案。)