IFormatProvider 接口

使用IFormatProvider 接口可以让你的代码变得优雅,msdn上有一个2-36进制转换的例子,你应该学习一下。
参考http://msdn.microsoft.com/zh-cn/library/system.iformatprovider(VS.80).aspx
其他相关借口还有ICustomFormatter和IFormattable.
具体的实例,在很多类型中都有ToString方法的重载,但是Guid的ToString方法的IFormatProvider 是个摆设。
 

阅读更多

大写金额转换器,支持 IFormatProvider 接口

01-25

rn  经常有人问这个问题,也经常有人回答,但大都不带注释,这使代码难以阅读,也不容易发现BUG,大家就等于在初级阶段做了很多重复劳动,所以我希望开发一个代码易读易懂的,供大家讨论并逐渐改进,做成比较成熟的转换器。所以写了个用正则表达式处理转换的,但没想到还是写了 7 条正则才完成,拼效率绝对拼不过循环和递归的,还请递归高人给补个方法。另外支持了 IFormatProvider 接口,使用起来比较方便,更方便日后逐渐扩充格式。rnrn  大家帮我测试这段代码,找到 BUG ,提供建议,添加方法,完善格式都有分,不够再加。大家需要的时候来这个帖子拷代码直接用行了。rnrn[code=C#]using System;rnusing System.Text.RegularExpressions;rnrnrnclass 转换器 : IFormatProvider, ICustomFormatterrnrn public static readonly 转换器 大写金额 = new 转换器();rn private 转换器()rn rn object IFormatProvider.GetFormat(Type formatType)rn rn return (this as ICustomFormatter);rn rn string ICustomFormatter.Format(string format, object arg, IFormatProvider formatProvider)rn rn bool isSelected = (format.Trim() == "大写");rn decimal number = 0M;rn tryrn number = Convert.ToDecimal(arg); rn catch (Exception)rn isSelected = false; rnrn if (!isSelected)rn if (arg is IFormattable)rn return ((IFormattable)arg).rn ToString(format, formatProvider);rn elsern return arg.ToString();rnrnrn // 格式化数字为两位小数的,带有位标志的数字,正数、负数和零分别对应分号隔开的格式rn string result = number.ToString("#穰'.'#仟#佰#拾#秭'.'#仟#佰#拾#垓'.'#仟#佰#拾#京'.'#仟#佰#拾#兆'.'#仟#佰#拾#億'.'#仟#佰#拾#萬'.'#仟#佰#拾#元.0角0分;负#穰'.'#仟#佰#拾#秭'.'#仟#佰#拾#垓'.'#仟#佰#拾#京'.'#仟#佰#拾#兆'.'#仟#佰#拾#億'.'#仟#佰#拾#萬'.'#仟#佰#拾#元.0角0分;零元");rn // 从字符串左侧开始替换子字符串,遇到汉字“零”或者阿拉伯数字 0 - 9,替换就结束。rn // 替换内容是捕获组 $1,该捕获组表示 0 个或 1 个在字符串最左侧的汉字“负”rn result = Regex.Replace(result, @"^(负?)[^零\d]*", "$1");rn // 替换字符串中以一个 0 开头,后跟一个字符,这种组合的连续。rn // 因为肯定不会出现两个阿拉伯数字连续的情况,所以后跟字符确定为汉字。rn // 规定该汉字不可以匹配汉字“元”。也不可以匹配右侧带“.”的汉字(特殊单位)。rn // 将所有找到的匹配替换为“0”,注意:结果可能会产生“0”的连续的情况。rn result = Regex.Replace(result, @"(0[^元](?!\.))+", "0");rn // 删除字符串最右侧的,或右侧带“.”的汉字左侧的,一个或多个“0”的连续。rn // 所有特殊单位的右侧带“.”,例如“億”“萬”“元”,这保证了上句不会替换它们。rn result = Regex.Replace(result, @"0+(\D\.|$)", "$1");rn // 替换所有以“.”开头的,一个汉字和一个“.”的组合,这是特殊单位左侧的个十百千位都是 0 造成的。rn // 所以删除该特殊单位的字符,左侧会有一个“0”和一个汉字的组合,该组合会包含被删掉的特殊单位的含义。rn result = Regex.Replace(result, @"(?<=\.)[^元]\.", "");rn // 删除掉所有“.”。rn result = Regex.Replace(result, @"\.", "");rn // 如果字符串最后以“元”结束,就换成“元整”。rn result = Regex.Replace(result, @"(元)$", "$1整");rn // 用匿名方法作代理,将每个数字替换成汉字形式。rn result = Regex.Replace(result, @"\d", delegate(Match m) return "零壹贰叁肆伍陆柒捌玖"[m.Value[0] - '0'].ToString(); );rnrn return result;rnrn rnrnclass Programrnrn static void Main(string[] args)rn rn object[] data = 0, 20050138000000M, "women", 0.425, 20.1, -9.63f ;rn foreach (object o in data)rn Console.WriteLine("0,30 1,-6", o, string.Format(转换器.大写金额, "0:大写", o));rn Console.ReadKey();rn rn[/code]

没有更多推荐了,返回首页