5

我想将一个整数输出为罗马数字,并遇到了 Jesse Slicer 的这个答案。这是一种扩展方法,但我想知道利用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());

我从未编写过格式提供程序,所以我不确定所涉及的工作,但这是我的问题。 对于像罗马数字这样定义明确的格式转换,您会使用:

  • 格式提供者
  • 使用扩展方法
  • Parse编写一个实现、TryParse和的 RomanNumeral 类ToString
  • 别的东西

为什么?

usingstring.Format()及其任何类似方法(例如StringBuilder.AppendFormat())是否会影响您的答案?显然,使用扩展方法,您无法使用这些格式化方法之一访问转换。

我认为实现整个范围的自定义类将是最谨慎的,但也是最耗时的。与自定义格式提供程序一起使用似乎会踩到一些现有的全球化东西(如果有的话)。

4

3 回答 3

1

格式提供程序适用于您自己的类型,但是在使用内置类型时它们很笨拙,因为您必须创建提供程序的一个实例并将其传递给 Format 方法,这消除了格式说明符的优势。直接在 int 上使用扩展方法要方便得多。

于 2009-07-10T19:12:21.423 回答
1

就个人而言,我会写一个罗马数字类,带有 tryparse、parse + tostring(),以及支持它的扩展方法,综合上述所有原因(包括你对 shahkalpesh 答案的后一个评论。)

于 2009-07-14T15:39:51.133 回答
0

我想这取决于您打算如何使用此功能。

IMO,扩展方法是一个很好的方法。不确定,您的程序集的用户如何使用 c# 1 或 2(不支持扩展方法的语言)会看到它。

两种方式的扩展方法都会很好。
即在数字类型上 - 从数字转换为罗马数字和
在字符串上 - 从罗马数字转换为数字(您将不得不考虑应该容纳最大值的数字类型)。

于 2009-07-10T18:52:07.517 回答