如何使用IFormattable接口实现格式化输出

分析问题

  在设计类型时,程序员应该尽量为类型使用者着想,其中重要的一点就是提供格式化的字符串输出。为类型编写格式化输出接口,类型自身和其使用者都将得到收益。对于一些类型,重写基类中的ToString方法就已经足够了,但对于有些类型,则需要提供多种格式的输出,这个时候ToString方法就不能满足需求了。此时就需要实现IFormattable中的ToString方法:

String IFormattable.ToString(String format,IFormatProvider formatProvider)

  该方法接受两个参数,第一个字符串参数告诉方法需要何种格式的输出,而第二个IFormatProvider的参数则允许类型使用者自定义格式化方法。IFormatProvider接口将在后续小节中讨论。以下代码展示了如何实现IFormattable接口。

using System;

namespace Test
{
    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 formatProvider)
        {
            //这一段将在后面章节讨论
            if (formatProvider!=null)
            {
                ICustomFormatter fmt = formatProvider.GetFormat(this.GetType()) as ICustomFormatter;
                if (fmt!=null)
                {
                    return fmt.Format(format, this, formatProvider);
                }
            }
            //这里实现格式化输出
            switch (format)
            {
                case "ld":
                    return _time.ToLongDateString();
                case "lt":
                    return _time.ToLongTimeString();
                case "sd":
                    return _time.ToShortDateString();
                case "st":
                    return _time.ToShortTimeString();
                case "G":
                //null和""在这里实现
                default:
                    return _time.ToString();
            }
        }

        static void Main()
        {
            UseIFormattable use = new UseIFormattable(DateTime.Now);
            //调用IFormattable.ToString方法

            Console.WriteLine(use);
            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();
        }

    }
}

  如上面代码所示,IFormattable.ToString方法主要使用第一个字符串参数来作为输出的依据,根据不同的输入来格式化类型对象。在实现IFormattable接口时,有几点需要读者注意:

  1、实现IFormattable.ToString方法通常可以自定义接受的格式字符串,但有三个字符串应该被实现:“G”、null和Empty。不实现这三个格式不会造成编译或者运行的错误,但潜在地违反了.NET的内建规范。

  2、当实现了IFormattable.ToString方法后,所有的内建类型都将调用IFormattable.ToString方法,而不是继承自System.Object的ToString方法。在以上代码中,Console.WriteLine方法就是一个例子。

  3、内建方法会自动调用IFormattable.ToString方法,使用的参数可能是“G”,也可能是空字符串,建议读者在设计类型时,把这几个格式实现成和Object.ToString具有相同的输出。

  4、在IFormattable.ToString方法的一开始,对IFormatProvider参数进行了检查,这一机制将在后续小节中详细介绍,简单来讲,它实现了让类型使用者提供格式化方法的功能。

  以下是上边代码的输出:

答案

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

如何使用IFormattable接口实现格式化输出

时间: 2024-08-02 02:31:03

如何使用IFormattable接口实现格式化输出的相关文章

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

分析问题 IFormatProvider的设计思想是站在类型使用者的角度来提供格式化的方法,这和前文中介绍的IFormattable接口站在类型设计者的角度不同.IFormatProvider只包含了一个方法:object GetFormat(Type formatType).该方法根据对象的类型给出了一个格式化器,IFormatProvider试图告诉类型用该格式化器去做格式化输出.当然最终的选择权仍然在类型设计者手中,现在在分析一下之前的代码,IFormattable.ToString方法的

格式化输出(%用法和format用法)

一.格式化输出1.整数的输出%o -- oct 八进制%d -- dec 十进制%x -- hex 十六进制 1 >>> print('%o' % 20) 2 24 3 >>> print('%d' % 20) 4 20 5 >>> print('%x' % 20) 6 14 2.浮点数输出(1)格式化输出%f --保留小数点后面六位有效数字 %.3f,保留3位小数位%e --保留小数点后面六位有效数字,指数形式输出 %.3e,保留3位小数位,使用科学

python基础_格式化输出(%用法和format用法)

%用法 1.整数的输出 %o —— oct 八进制%d —— dec 十进制%x —— hex 十六进制 >>> print('%o' % 20) 24 >>> print('%d' % 20) 20 >>> print('%x' % 20) 14 2.浮点数输出 2.1 格式化输出 %f ——保留小数点后面六位有效数字 %.3f,保留3位小数位%e ——保留小数点后面六位有效数字,指数形式输出 %.3e,保留3位小数位,使用科学计数法%g ——在保证

golang格式化输出-fmt包用法详解

注意:我在这里给出golang查询关于包的使用的地址:https://godoc.org    声明: 此片文章并非原创,大多数内容都是来自:https://godoc.org/fmt,通过谷歌翻译进行翻译而来.   import "fmt" fmt包实现了类似C语言printf和scanf的格式化I/O.格式化verb('verb')源自C语言但更简单. Printing verb: 通用: 1 %v 值的默认格式表示.当输出结构体时,扩展标志(%+v)会添加字段名 2 %#v 值的

python变量及用户交互,用户名格式化输出

变量 name = wwjun Name2 = "wwjun" print ("name,Name2") 用户交互 Username = input ("username:") Password = input ("password:") Print(username,password) 用户名格式化输出 name = input ("name:") age = input ("age:"

var_dump() 格式化输出 | 显示不全

PHP 使用‘var_dump($var)’时 没有格式化输出,显得乱糟糟的.原因是没有启用‘XDebug’扩展 [php.ini] ; XDEBUG Extension zend_extension = "x:/wamp/bin/php/php5.5.12/zend_ext/php_xdebug-2.2.5-5.5-vc11.dll" var_dump()方法输出时候会展示不全出现省略号 解决下 在php.ini里的[xdebug]节点中,追加一下配置: xdebug.var_dis

python 3 用户输入和格式化输出

# -*- coding:utf-8 -*- #用户输入 && 格式化输出 #getpass 模块是内置的,可以将输入的内容隐藏 import getpass username = input("username:") password = input("password:") age = int (input("age:")) job = input("job:") #print(type(age),type

Python 格式化输出

2017-07-29  22:03:07 一.使用格式符%进行格式控制 %[(name)][flags][width].[precision]typecode (name):命名 flags:可以有+,-,' '或0.+表示右对齐.-表示左对齐.' '为一个空格,表示在正数的左侧填充一个空格,从而与负数对齐.0表示使用0填充 wideth : 表示显示宽度,占位个数 precision : 表示小数点后精度 typecode : 格式符为真实值预留位置,并控制显示的格式.格式符可以包含有一个类型

python开发基础:格式化输出

1 #format的三种玩法 2 res1 = '{},{},{}'.format('joker','male',18) 3 print(res1) #类似于占位符 4 res2 = '{1},{0},{1}'.format('joker','male',18) 5 print(res2) #类似于列表角标查找 6 res3 = '{name},{age},{sex}'.format(sex='male',name='joker',age='18') 7 print(res3) #指定参数 8