CLR via C# - Char_String - Format
2014-03-09 23:30
197 查看
//前面那个本来想重新编辑的,但是那个编辑器之前被我调到Markdown之后,改回Tiny MCE编辑器不出来
View Code
在上面代码中,昨天写的,今天想想漏掉一种情况,当arg是char类型,且format不为空,format又不等于'U'和'u'的情况下,返回String.Empty是错误的,应该交给常规情况来处理
重复代码很多,可以抽象出一个基类CustomerFormatter出来
再次实现UnicodeFormatter时就简单多了,只需要继承自CustomFormatter<需要处理的类型>,再重写FormatCustom方法即可
练练手,简单的DatetimeFormat,zh-cn格式输出咱常用的yyyy-MM-dd HH:mm:ss形式
关于Format的东西就到这里...午睡没了...啊
1.ToString()方法 & IFormattable & IFormatProvider
先说ToString()
在System.Int32中定义了4个ToString方法using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace CLR_String_Char { public class UnicodeFormatProvider : ICustomFormatter,IFormatProvider { public object GetFormat(Type formatType) { if(formatType == typeof(ICustomFormatter)) { return this; } else { return System.Globalization.CultureInfo.CurrentCulture.GetFormat(formatType); } } public string Format(string format,object arg,IFormatProvider formatProvider) { var str = string.Empty; if(arg.GetType() == typeof(char) && format != null )//是char { if(format=="u") { str = "\\u" + ((int)((char)arg)).ToString("x4"); } else if(format == "U") { str = "\\u" + ((int)((char)arg)).ToString("X4"); } } else if(arg is IFormattable)//arg 实现了IFormattable接口 { //formatprovider str = (arg as IFormattable).ToString(format,null); } else if(arg != null) { str = arg.ToString(); } return str; } } }
View Code
在上面代码中,昨天写的,今天想想漏掉一种情况,当arg是char类型,且format不为空,format又不等于'U'和'u'的情况下,返回String.Empty是错误的,应该交给常规情况来处理
重复代码很多,可以抽象出一个基类CustomerFormatter出来
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace CLR_String_Char { public abstract class CustomFormatter<T> : ICustomFormatter,IFormatProvider { //IFormatProvider.GetFormat public object GetFormat(Type formatType) { if(formatType == typeof(ICustomFormatter)) { //要的就是CustomFormatter return this; } else { return System.Globalization.CultureInfo.CurrentCulture.GetFormat(formatType); } } //ICustomFormatter.Format public string Format(string format,object arg,IFormatProvider formatProvider) { if(arg.GetType() == typeof(T) && format != null )//是char { return FormatCustom(format,(T)arg); } return FormatRegular(format,arg); } //处理常规字符 public string FormatRegular(string format,object arg) { if(arg is IFormattable)//arg 实现了IFormattable接口 { //formatprovider return (arg as IFormattable).ToString(format,null); } else if(arg != null) { return arg.ToString(); } return string.Empty; } //处理 自定义格式 类型,如果不重写,也返回FormatRegular public virtual string FormatCustom(string format,T arg) { return FormatRegular(format,arg); } } }
再次实现UnicodeFormatter时就简单多了,只需要继承自CustomFormatter<需要处理的类型>,再重写FormatCustom方法即可
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace CLR_String_Char { public class UnicodeFormatProvider : CustomFormatter<char> { //处理所有arg is T,format不为空的情况 public override string FormatCustom(string format,char arg) { if(format == "U") { return "\\u"+((int)arg).ToString("X4"); } if(format == "u") { return "\\u"+((int)arg).ToString("x4"); } //是char,format不为空,交给FormatRegular来处理,如果不支持,抛出FormatException return base.FormatCustom(format,arg); } } }
练练手,简单的DatetimeFormat,zh-cn格式输出咱常用的yyyy-MM-dd HH:mm:ss形式
class MyDateTimeFormatter : CustomFormatter<DateTime> { public override string FormatCustom(string format,DateTime arg) { //自定义了一个格式:zh-cn if(format.Equals("zh-cn",StringComparison.OrdinalIgnoreCase)) { return arg.ToString("yyyy-MM-dd HH:mm:ss"); } return base.FormatCustom(format,arg); } }
关于Format的东西就到这里...午睡没了...啊
相关文章推荐
- C#字符串截取
- 【C#】结对项目开发-电梯调度需求分析(党云龙、黄为)
- c# udp局域网通信
- C#多线程编程
- C#多线程编程
- C#多线程JOIN方法初探
- C#多线程JOIN方法初探
- C#执行命令行命令
- C# webservice应用 简单实例
- C# 串口操作系列(3) -- 协议篇,二进制协议数据解析
- c#,用面向对象思想写一个计算器
- C#设计模式(14)——模板方法模式(Template Method)
- C#设计模式(13)——代理模式(Proxy Pattern)
- C#设计模式(12)——享元模式(Flyweight Pattern)
- C#设计模式(11)——外观模式(Facade Pattern)
- C#设计模式(10)——组合模式(Composite Pattern)
- C#设计模式(9)——装饰者模式(Decorator Pattern)
- C#设计模式(8)——桥接模式(Bridge Pattern)
- C#设计模式(7)——适配器模式(Adapter Pattern)
- C#设计模式(6)——原型模式(Prototype Pattern)