我想要输出一个整数到罗马数字,然后在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());
我从来没有写过格式提供程序,所以我不确定所涉及的工作,但这是我的问题。 对于像罗马数字这样明确定义的格式转换,您会使用:
Parse
,TryParse
和ToString
为什么?
使用string.Format()
及其任何堂兄方法(例如StringBuilder.AppendFormat()
)会影响您的回答吗?显然,对于扩展方法,您无法使用这些格式化方法之一访问转换。
我认为实现整个色域的自定义类将是最谨慎但也是最耗时的。使用自定义格式提供程序似乎会踩到现有全球化的东西(如果有的话)。
答案 0 :(得分:1)
格式提供程序适用于您自己的类型,但是当使用内置类型时它们很笨拙导致您必须创建提供程序的实例并将其传递给Format方法,这会消除格式说明符的优势。直接在int上使用扩展方法要方便得多。
答案 1 :(得分:1)
就个人而言,我会写一个罗马数字类,使用tryparse,parse + tostring(),并使用扩展方法来支持它,结合上述所有原因(包括你对shahkalpesh的回答的后一条评论。)
答案 2 :(得分:0)
我想这取决于您打算如何使用此功能。
IMO,扩展方法是一个很好的方法。不确定,使用c#1或2(不支持扩展方法的语言)的程序集的用户将如何看到它。
扩展方法两种方式都会很好
即数字类型 - 从数字转换为罗马和
在字符串上 - 要从罗马字母转换为数字(您必须考虑一个应该容纳最大值的数字类型)。