【C# IO 操作 】IFormatProvider接口|IFormattable 接口 格式化接口
IFormatProvider接口获取一个满足要求的个格式化器。
方法 object? GetFormat(Type? formatType);GetFormat方法主要提供一个满足指定要求的对象,该对象提供格式信息。GetFormat方法返回一个格式化器,通常,该格式化器的类型是一个实现了ICustomFormatter的类型对象。
IFormattable 接口 提供一种功能,用以将对象的值格式化为字符串表示形式。
方法:string ToString(string? format, IFormatProvider? formatProvider);
string? format:格式化类型例如:E、 C、N等
IFormatProvider? formatProvider: CultureInfo、DateTimeFormatInfo、NumberFormatInfo
ICustomFormatter 接口是提供给 格式化器类的。具体格式化功能在这个类的方法中实现
string Format(string? format, object? arg, IFormatProvider? formatProvider);
格式信息由谁来 Format提供 。
总结:先通过IFormatProvider接口的GetFormat()方法得到提供格式化信息的对象,再通过该对象Format()f方法的得到该对象提供的格式化信息。
IFormatProvider 接口
- 派生
IFormattable 接口
派生
案例:
public class MyFormater:ICustomFormatter,IFormatProvider
{
public object GetFormat(Type format)
{
if (format == typeof(ICustomFormatter))
return this;
return null;
} public string Format(string format, object arg, IFormatProvider provider)
{
if (format == null)
{
if (arg is IFormattable)
return ((IFormattable)arg).ToString(format, provider);
return arg.ToString();
}
else
{
if (format == "MyFormater")
{
return "**" + arg.ToString();
}
else
{
if (arg is IFormattable)
return ((IFormattable)arg).ToString(format, provider);
return arg.ToString();
}
}
}
}
static void Main(string[] args)
{
int i = 100;
string printString;
MyFormater myFormater = new MyFormater();
printString = string.Format(myFormater, "{0}", i);
Console.WriteLine("{0}", printString);
printString = string.Format(myFormater, "{0:C}", i);
Console.WriteLine("{0}", printString);
printString = string.Format(myFormater, "{0:MyFormater}", i);
Console.WriteLine("{0}", printString);
}
主要共能由string.Format 提供
public static string Format(IFormatProvider provider, string format, params object[] args)
{
if ((format == null) || (args == null))
{
throw new ArgumentNullException((format == null) ? "format" : "args");
}
StringBuilder sb = StringBuilderCache.Acquire(format.Length + (args.Length * 8));
sb.AppendFormat(provider, format, args);
return StringBuilderCache.GetStringAndRelease(sb);
}
结合我们的函数调用阅读函数签名,了解到:string.Format方法的第一个参数接收我们传入的自定义格式化类对象myFormater,第二个参数接收格式化字符串format,第三个参数接收需要被格式化的参数集合args,这里仅变量i。
查看string.Format方法体,可以了解到:方法先对传入参数format及args进行非法判断,参数为空时抛出参数空异常。参数正常时,初始化StringBuilder 对象(关于StringBuilderCache.Acquire的使用这里不做过多介绍,自己去研究),接着调用sb.AppendFormat方法,最后通过语句return StringBuilderCache.GetStringAndRelease(sb)返回结果。可见,真正的格式化操作都在sb.AppendFormat方法中完成,这里并不打算给出sb.AppendFormat方法的完整代码,只是给出sb.AppendFormat方法中调用GetFormat 方法和Format 方法的代码
if (provider != null)
{
formatter = (ICustomFormatter) provider.GetFormat(typeof(ICustomFormatter));
}
代码传入参数typeof(ICustomFormatter),返回ICustomFormatter类型的formatter 。
if (formatter != null)
{
if (builder != null)
{
str = builder.ToString();
}
str2 = formatter.Format(str, arg, provider);
}
【C# IO 操作 】IFormatProvider接口|IFormattable 接口 格式化接口的更多相关文章
- Linux IO操作——RIO包
1.linux基本I/O接口介绍 ssize_t read(int fd, void *buf, size_t count); ssize_t write(int fd, void *buf, siz ...
- python之协程与IO操作
协程 协程,又称微线程,纤程.英文名Coroutine. 协程的概念很早就提出来了,但直到最近几年才在某些语言(如Lua)中得到广泛应用. 子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B ...
- JAVASE02-Unit08: 文本数据IO操作 、 异常处理
Unit08: 文本数据IO操作 . 异常处理 * java.io.ObjectOutputStream * 对象输出流,作用是进行对象序列化 package day08; import java.i ...
- java中的IO操作总结
一.InputStream重用技巧(利用ByteArrayOutputStream) 对同一个InputStream对象进行使用多次. 比如,客户端从服务器获取数据 ,利用HttpURLConnect ...
- .NET中的IO操作基础介绍
关于IO简介 .NET中的IO操作,经常需要调用一下几个类. clipboard[] .FileStream类 文件流类,负责大文件的拷贝,读写. .Path类 Path类中方法,基本都是对字符串(文 ...
- 树莓派学习笔记——使用文件IO操作GPIO SysFs方式
0 前言 本文描写叙述假设通过文件IO sysfs方式控制树莓派 GPIO端口.通过sysfs方式控制GPIO,先訪问/sys/class/gpio文件夹,向export文件写入GPIO编号, ...
- node.js零基础详细教程(4):node.js事件机制、node异步IO操作
第四章 建议学习时间3小时 课程共10章 学习方式:详细阅读,并手动实现相关代码 学习目标:此教程将教会大家 安装Node.搭建服务器.express.mysql.mongodb.编写后台业务逻辑. ...
- C++ IO操作API及注意事项(包含一个日志类的实现)
C++是一个抽象程度比C高很多的语言,在使用C++时,编译器做了很多工作,如果我们不对C++的某些特性的实现机制进行了解,那么编程时也许会有很多疑惑,我们也许知道怎样做才是正确的,但不知道为什么要这样 ...
- Linux学习记录--文件IO操作相关系统编程
文件IO操作相关系统编程 这里主要说两套IO操作接口,各自是: POSIX标准 read|write接口.函数定义在#include<unistd.h> ISO C标准 fread|fwr ...
- java接口对接——调用别人接口推送数据
实际开发中经常会遇到要和其他平台或系统对接的情况,实际操作就是互相调用别人的接口获取或者推送数据, 当我们调用别人接口推送数据时,需要对方给一个接口地址以及接口的规范文档,规范中要包括接口的明确入参及 ...
随机推荐
- 春节将至,喜庆的烟花安排上(js实现烟花)
一年一度的春节即将来临,然后苦逼的我还在使劲的摸鱼,未能回家体验小时候路边放爆竹的快乐时光,所以只能在网上来实现这个小小的心愿了.烟花静态效果图如下: 为了大伙复制方便就不分开写,直接复制即可,具体实 ...
- golang中的标准库log
Go语言内置的log包实现了简单的日志服务.本文介绍了标准库log的基本使用. 使用Logger log包定义了Logger类型,该类型提供了一些格式化输出的方法.本包也提供了一个预定义的" ...
- mesos是什么
听过不少人在讨论 Mesos,然而并不是很明白 Mesos 到底能够解决什么问题,使用场景是怎样的,周伟涛(国内较早一批接触使用 Docker,Mesos 等技术的开发者)用一句话形容它, Mesos ...
- linux系统别名
目录 一:系统别名 一:系统别名 alias 格式: alias xxx='命令' alias : 查看系统别名 alias rm='xxx' : 设置系统别名 改别名 别名 执行这个命令 [root ...
- AT2657 [ARC078D] Mole and Abandoned Mine
简要题解如下: 记 \(1\) 到 \(n\) 的路径为关键路径. 注意到关键路径只有一条是解题的关键,可以思考这张图长什么样子. 不难发现关键路径上所有边均为桥,因此大致上是关键路径上每个点下面挂了 ...
- ==和equeals区别以及使用场景
定义 ==:基本数据类型比较的是值或地址,引用数据类型比较的是地址. equals:在不重写的情况下,和==没有任何区别,重写,可以自定义比较规则,一般重写之后都让其比较值. Object类中的equ ...
- bom-倒计时
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Jackson中处理map中的null key 或者null value 及实体字段中的null value
1.map中有null key时的序列化 当有null key时,jackson序列化会报 Null key for a Map not allowed in JSON (use a convert ...
- html5 新增标签和特性
文档类型设定 document HTML: XHTML: HTML5 字符设定 <meta http-equiv="charset" content="utf-8& ...
- @property中的copy关键字
1.@property中的copy的作用 防止外界修改内部的值 @interface Person : NSObject @property (nonatomic, retain) NSString ...