点滴拾遗 - 自定义 Format 控制 String.Format 行为
String.Format 一重载方法的签名如下
public static string Format(
IFormatProvider provider,
string format,
params Object[] args
)
可以通过自定义 IFormatProvider 接口来控制 String.Format 执行过程中的特定行为。
过程如下
1, 自定义类实现 IFormatProvider 接口(object GetFormat 方法)
public object GetFormat(Type formatType)
{
if (formatType == typeof(ICustomFormatter))
return this;
else
return null;
}
2, 实现 ICustomFormatter 借口(string Format 方法)
摘自 MSDN。功能为控制 Int64 type 的string输出。
public string Format(string fmt, object arg, IFormatProvider formatProvider)
{
// Provide default formatting if arg is not an Int64.
if (arg.GetType() != typeof(Int64))
try
{
return HandleOtherFormats(fmt, arg);
}
catch (FormatException e)
{
throw new FormatException(String.Format("The format of '{0}' is invalid.", fmt), e);
} // Provide default formatting for unsupported format strings.
string ufmt = fmt.ToUpper(CultureInfo.InvariantCulture);
if (!(ufmt == "H" || ufmt == "I"))
try
{
return HandleOtherFormats(fmt, arg);
}
catch (FormatException e)
{
throw new FormatException(String.Format("The format of '{0}' is invalid.", fmt), e);
} // Convert argument to a string.
string result = arg.ToString(); // If account number is less than 12 characters, pad with leading zeroes.
if (result.Length < ACCT_LENGTH)
result = result.PadLeft(ACCT_LENGTH, '');
// If account number is more than 12 characters, truncate to 12 characters.
if (result.Length > ACCT_LENGTH)
result = result.Substring(, ACCT_LENGTH); if (ufmt == "I") // Integer-only format.
return result;
// Add hyphens for H format specifier.
else // Hyphenated format.
return result.Substring(, ) + "-" + result.Substring(, ) + "-" + result.Substring();
}
使用实现好的 Format 类
long acctNumber;
double balance;
DaysOfWeek wday;
string output; acctNumber = ;
balance = 16.34;
wday = DaysOfWeek.Monday; output = String.Format((new AcctNumberFormat(),
"On {2}, the balance of account {0:H} was {1:C2}.",
acctNumber, balance, wday);
Console.WriteLine(output);
执行结果如下

参考资料
Culture invariant Decimal.TryParse() http://stackoverflow.com/questions/23131414/culture-invariant-decimal-tryparse
What does IFormatProvider do? http://stackoverflow.com/questions/506676/what-does-iformatprovider-do
IFormatProvider Interface https://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx
点滴拾遗 - 自定义 Format 控制 String.Format 行为的更多相关文章
- C# string.Format 和 String.Format 的区别
string.Format 和 String.Format ,不论是用法还是意思,都是一样的 怎么使用? 通过 占位符来替换 ,类似于 Replace 的操作 string s = string.F ...
- MessageFormat.format()和String.format()
MessageFormat 提供了以与语言无关方式生成连接消息的方式.使用此方法构造向终端用户显示的消息. MessageFormat 获取一组对象,格式化这些对象,然后将格式化后的字符串插入到模式中 ...
- C# String.Format大全
C# String.Format大全 ? ? ? 十进制的数字 ? ? string.Format("{0:D3}",23) 023 格式化十进制的数字 string.Format ...
- JS字符串格式化函数 string.format
原生JS写的仿C#的字符串format函数,在此基础上又增加了便于JS使用的字面量对象参数. 参照C#中的规则,调用的时候会检测字符串格式,如果字符串格式不规范,或者传入的参数为null或undefi ...
- String.Format in javascript
有些时候,我们确实需要在JavaScript中进行字符串替换,类似于C#中的String.Format()方法一样,只不过这种格式化替换只局限于对由'{0}','{1}','{2}'...所组成的“占 ...
- (转)使用string.Format需要注意的一个性能问题
今天,我在写C#代码时,突然发现一个最熟悉的陌生人 —— string.Format.在写C#代码的日子里,与它朝夕相伴,却没有真正去了解它.只知道在字符串比较多时,用它比用加号进行字符串连接效率更高 ...
- 异常-----Can't convert the date to string, because it is not known which parts of the date variable are in use. Use ?date, ?time or ?datetime built-in, or ?string.\u003Cformat> or ?string(format) built-
1.错误描述 五月 27, 2014 12:07:05 上午 freemarker.log.JDK14LoggerFactory$JDK14Logger error 严重: Template proc ...
- VFP自定义函数StringFormat (仿.NET String.Format 方法)
VFP仿.NET String.Format 方法 将指定字符串中的每个{x}替换为相应值,并返回文本 *-- 调用格式 StringFormat("日期{2},字符{1}",&q ...
- 【转】string.Format对C#字符串格式化
转自:http://blog.csdn.net/samsone/article/details/7556781 1.格式化货币(跟系统的环境有关,中文系统默认格式化人民币,英文系统格式化美元) str ...
随机推荐
- activemq的高级特性:消息的可靠性
高级特性之消息的可靠性 可靠性分为:生产者.消费者.生产者必须让mq收到消息,消费者必须能够接收到消息并且消费成功,这就是消息的可靠性. 1:生产者可靠性 Session session = conn ...
- Mysql 查询是否锁表
1.查询是否锁表show OPEN TABLES where In_use > 0; 2.查询进程 show processlist 查询到相对应的进程===然后 kill id 补充:查看正在 ...
- 偏前端 + rsa加解密 + jsencrypt.min.js--(新增超长字符分段加解密)
<html> <head> <title>JavaScript RSA Encryption</title> <meta charset=&quo ...
- PHP程序员学Objective-C之后的变化
趣味坎谈,不一定100%准确,以自己的实际情况为准; 如题,我2008年开始学PHP,PHP是我学的第二门编程语言,一直用到现在,2010年初开始做iOS开发,学习了Objective-C,学这2门语 ...
- php实现姓名按首字母排序的类与方法
php将名字按首字母进行排序 <?php public function getFirstChar($s){ $s0 = mb_substr($s,0,3); //获取名字的姓 $s = ico ...
- java-spark的各种常用算子的写法
通常写spark的程序用scala比较方便,毕竟spark的源码就是用scala写的.然而,目前java开发者特别多,尤其进行数据对接.上线服务的时候,这时候,就需要掌握一些spark在java中的使 ...
- Python中各种进制之间的转化
1.十进制转化为其它进制 (1)bin(x):十进制转化为二进制 [实例1] x=bin(20) # x的值为字符串'0b10100' (2)oct(x):十进制转化为八进制 [实例2] x=oc ...
- 从网上下载小说_keywords:python、multiprocess
# -*- coding: utf-8 -*- __author__ = "YuDian" from multiprocessing import Pool # Pool用来创建进 ...
- 20155207 2016-2017-2《Java程序设计》课程总结
20155207 2016-2017-2<Java程序设计>课程总结 每周作业链接汇总: 预备作业一:一路风景---我期待的是师生关系 预备作业二:学习情况的相关调查 预备作业三:安装虚拟 ...
- 微信小程序点击按钮,修改状态
WXML中: <view wx:if="{{orderstate}} = '待送检' " data-no="{{orderstate}}" bindtap ...