.NET基础 (13)IFormattable和IformatProvider的使用

IFormattable和IformatProvider的使用
1 如何使用IFormattable接口实现格式化输出
2 如何告诉类型格式化输出的方式

IFormattable和IformatProvider的使用
1 如何使用IFormattable接口实现格式化输出

对于一些类型,重写基类中的ToString方法已经能够满足需求,但对于有些类,则需要提供多种格式的输出,这时候ToString方法就不能满足需求了。此时就需要实现IFormattable中的ToString方法。

IFormattable接口帮助类型实现了多样式的格式化输出。IFormattable的ToString方法接受一个代表格式的字符串参数,通过对这个参数的分析来进行格式化输出。另外,IFormattable.ToString方法接受一个IFormatProvider类型的参数,以允许类型的使用者提供格式化方法。

最典型的就是DateTime类,它就实现了IFormattable接口。

示例:

    class UseIFormattable:IFormattable
    {
        private DateTime _time;

        public UseIFormattable(DateTime time)
        {
            _time = time;
        }
        //重写ToString方法
        public override string ToString()
        {
            return "Object.ToString()";
        }
        public String ToString(String format,
                        IFormatProvider provider)
        {
            //这一段将在后面讨论
            if (provider != null)
            {
                ICustomFormatter fmt = provider.GetFormat(
                  this.GetType())
                  as ICustomFormatter;
                if (fmt != null)
                    return fmt.Format(format, this, provider);
            }
            //这里实现格式化输出
            switch (format)
            {
                case "ld":
                    return _time.ToLongDateString();
                case "lt":
                    return _time.ToLongTimeString();
                case "sd":
                    return _time.ToShortDateString();
                case "st":
                    return _time.ToShortTimeString();
                //G 必须实现
                case "G":
                default: //nul和“”在这里实现
                    return _time.ToString();
            }
        }
        static void Main(string[] args)
        {
            UseIFormattable use = new UseIFormattable(DateTime.Now);
            Console.WriteLine(use);   //调用的是IFormattable.ToString方法
            Console.WriteLine(use.ToString("ld", null));
            Console.WriteLine(use.ToString("lt", null));
            Console.WriteLine(use.ToString("sd", null));
            Console.WriteLine(use.ToString("st", null));
            Console.Read();
        }
    }

输出:

2015/9/10 16:56:29
2015年9月10日
16:56:29
2015/9/10
16:56

2 如何告诉类型格式化输出的方式

IFormatProvider让类型的使用者有机会提供格式化的方法。GetFormat方法返回一个格式化器,通常,该格式化器的类型是一个实现了ICustomFormatter的类型对象。IFormatProvider接口和IFormattable接口一起可以实现灵活强大的格式化输出。

示例:

    class UseIFormatProvider : IFormattable
    {
        public DateTime _time;

        public UseIFormatProvider(DateTime time)
        {
            _time = time;
        }
        //重写ToString方法
        public override string ToString()
        {
            return "Object.ToString()";
        }
        public String ToString(String format,
                        IFormatProvider provider)
        {
            //这里判断使用者是否提供了格式化器
            if (provider != null)
            {
                ICustomFormatter fmt = provider.GetFormat(
                  this.GetType())
                  as ICustomFormatter;
                if (fmt != null)
                    return fmt.Format(format, this, provider);
            }
            //这里实现格式化输出
            switch (format)
            {
                case "ld":
                    return _time.ToLongDateString();
                case "lt":
                    return _time.ToLongTimeString();
                case "sd":
                    return _time.ToShortDateString();
                case "st":
                    return _time.ToShortTimeString();
                //G 必须实现
                case "G":
                default: //nul和“”在这里实现
                    return _time.ToString();
            }
        }
        static void Main(string[] args)
        {
            UseIFormatProvider use = new UseIFormatProvider(DateTime.Now);
            IFormatProvider provider = new MyProvider();
            Console.WriteLine(use);   //调用的是IFormattable.ToString方法
            //使用者提供格式化方法,格式化字符串不再起作用
            Console.WriteLine(use.ToString("lt", provider));
            Console.WriteLine(use.ToString("st", provider));
            Console.Read();
        }
    }

    //实现了IFormatProvider的类型,
    //为了方便示例,同时实现ICustomFormatter接口,其实在实际情况中,这样的做法也很常见
    class MyProvider : ICustomFormatter, IFormatProvider
    {
        //实现了ICustomFormatter的Format方法
        //实际的格式化工作在这里完成
        String ICustomFormatter.Format(string format, object arg, IFormatProvider formatProvider)
        {
            UseIFormatProvider obj = arg as UseIFormatProvider;
            if (obj == null)
                return arg.ToString();
            return obj._time.ToString("yyyy-MM-dd HH:mm:ss");
        }
        //本类型可以实现对UseIFormatProvider类型的格式化,
        //所以先判断对象的类型
        Object IFormatProvider.GetFormat(Type type)
        {
            if (type == typeof(UseIFormatProvider))
                return this;
            else
                return null;
        }
    }

输出:

2015/9/10 17:03:31
2015-09-10 17:03:31
2015-09-10 17:03:31

转载请注明出处:

作者:JesseLZJ
出处:http://jesselzj.cnblogs.com

时间: 2024-10-21 07:02:55

.NET基础 (13)IFormattable和IformatProvider的使用的相关文章

Java基础13:反射与注解详解

Java基础13:反射与注解详解 什么是反射? 反射(Reflection)是Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性. Oracle官方对反射的解释是 Reflection enables Java code to discover information about the fields, methods and constructors of loaded classes, and to use reflected fi

linux基础13

C/S服务架构典型服务模式:C/S,Client/Server由服务器提供资源或者某种功能客户机使用资源或功能 服务端:能够提供某种资源或者功能的应用程序 需要在服务器上监听某个ip地址的某个端口 客户端:能够访问某种资源或功能的应用程序 能够通过ip地址,端口号连接到服务端程序 应用层协议:服务端与客户端共同遵守的一套通信协议 常见网络服务:----------------------------+类型 | 资源,功能 | 应用层协议 |文件传输 | 文件下载,上传 | FTP |网站 | 网

JavaScript基础13——js的string对象

1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>js的string对象</title> 6 <script type="text/javascript"> 7 var str = "abcdefg"; 8 document.write("str字符串:"

Python基础13 - Paramiko模块学习

@@@文章内容参照老男孩教育 Alex金角大王,武Sir银角大王@@@ 一.Paramiko模块安装 系统环境CentOS 7,Python3.6 1.安装Python3.6 2.yum安装openssl-devel 1 [[email protected] ~]# yum install openssl-devel -y 3.重新编译ssl模块 1 cd Python-3.6.2 2 ./configure --with-ssl 3 make 4 sudo make install 4使用pi

python基础13——名称空间与作用域

昨日review 0: 引用传递 python中所有值的传递,传递的都是不是值本身,而是值的引用,即内存地址 1.函数分为两大类,分别是是什么?二者在使用时有何区别? 内置函数 自定义函数 2.什么是形参.什么是实参?形参与实参之间的关系是什么? def func(x,y): print(x) func(1,2) 3.简述两只形参的区别:位置形参.默认形参 x=[] def func(name,age,gender=None):                                 #

2015/9/17 Python基础(13):函数

函数是对程序逻辑进行结构化或过程化的一种编程方法. Python的函数返回值当什么也不返回时,返回了None和大多数语言一样,Python返回一个值或对象.只是在返回容器对象时,看起来像返回多个对象.这样在操作的时候显得很灵活,虽然它本质上只是反悔了一个对象. 调用函数我们用一对圆括号电泳函数.任何输入的参数都应该放在括号中. 关键字参数这个概念是针对函数调用的,比如我们有这样的函数 def fun(value, count): fun_suite 我们可以标准调用: fun(12,20) 也可

python基础13函数以及函数式编程

主要内容 函数基本语法及特性 参数与局部变 返回值 4.递归 名函数 6.函数式编程介绍 阶函数 8.内置函数 函数基本语法及特性 定义 数学函数定义:一般的,在一个变化过程中,如果有两个变量x和y,并且对于x的每一 个确定的值,y都有唯一确定的值与其对应,那么我们就把x称为自变量,把y称为因变 量,y是x的函数.自变量x的取值范围叫做这个函数的定义域. 但编程中的「函数」概念,与数学中的函数是有很 同的 函数是逻辑结构化和过程化的一种编程方法 函数的优点 减少重复代码 使程序变的可扩展 使程序

Win10系列:C#应用控件基础13

Image控件 开发Windows应用商店应用时,除了在界面中显示文字信息以外,还可以加入图片来配合说明及增加美观度.使用Image控件能够实现显示图片的功能,开发者可以根据需求使图片按照不同的方式显示在界面中. 在XAML文件中,Image控件的用法如下所示: <Image .../> 下面介绍一下Image控件的两个常用属性: Source属性,获取或设置图片的地址源. Stretch属性,表示图片的呈现状态,共有4种属性值,分别为None.Uniform.UniformToFill.Fi

C语言基础(13)-函数

一. 函数的原型和调用 在使用函数前必须定义或者声明函数. double circle(double r); int main() { double length = circle(10); printf("length = %f\n", length); return 0; } double circle(double r) { return 2 * 3.14 * r; } 二. 函数的形参和实参 在调用函数的时候,函数大多数都有参数,主调函数和被调用函数之间需要传递数据. 在定义函