您的位置:首页 > 编程语言 > C#

CLR via C# - Char_String - Format

2014-03-09 23:30 197 查看
//前面那个本来想重新编辑的,但是那个编辑器之前被我调到Markdown之后,改回Tiny MCE编辑器不出来

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的东西就到这里...午睡没了...啊
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: