string.Format 的功能非常有限,因此需要使用 SmartFormat.NET 框架来完成丰富的字符串插值功能。它可以使用类似于字符串的最小化、直观的语法将各种数据源格式化为字符串。格式。所有格式化都在运行时进行。SmartFormat 使用扩展来提供命名占位符、本地化、多元化、性别结合以及列表和时间格式。可以嵌套格式化扩展插件。
框架地址:
https://github.com/axuno/SmartFormat
https://github.com/axuno/SmartFormat/wiki
基础使用方法
SmartFormat 最常见有两种用法,一种是通过对象的属性插值,一种是通过字典插值。
通过对象插值时,字符串模板占位符使用 属性或字段名称
。
var data = new { Library = "SmartFormat" };
var str = Smart.Format("Composed with {Library}.", data);
Console.WriteLine(str);
// 输出:Composed with SmartFormat.
使用字典插值时,Key 跟占位符名称保持一致即可。
var data = new Dictionary<string, string> { { "Library", "SmartFormat" } };
var str = Smart.Format("Composed with {Library}.", data);
Console.WriteLine(str);
在开发中,往往会有很多定制需求,因此我们可以自定义格式化器。
var sf = Smart.CreateDefaultSmartFormat();
var data = new Dictionary<string, string> { { "Library", "SmartFormat" } };
var str = sf.Format("Composed with {Library}.", data);
Console.WriteLine(str);
比如说,要使用的占位符在对象或字典中不存在时,默认会报错。
var data = new Dictionary<string, string> { { "Library", "SmartFormat" } };
var str = sf.Format("Composed with {Library1}.", data);
可以通过 FormatErrorAction、ParseErrorAction 两个枚举定义处理办法。
public enum FormatErrorAction
{
// 默认抛出异常
ThrowError,
// 不报错,但是在占位符位置输出报错信息
OutputErrorInResult,
// 忽略,没有区配到的占位符会打印空值
Ignore,
// 占位符位置保持原样。
MaintainTokens
}
比如:
var sf = Smart.CreateDefaultSmartFormat();
sf.Settings.Formatter.ErrorAction = FormatErrorAction.MaintainTokens;
sf.Settings.Parser.ErrorAction = ParseErrorAction.Ignore;
var data = new Dictionary<string, string> { { "Library", "SmartFormat" } };
var str = sf.Format("Composed with {Library1}.", data);
Console.WriteLine(str);
// 打印:Composed with {Library1}.
var sf = Smart.CreateDefaultSmartFormat();
sf.Settings.Formatter.ErrorAction = FormatErrorAction.OutputErrorInResult;
sf.Settings.Parser.ErrorAction = ParseErrorAction.Ignore;
var data = new Dictionary<string, string> { { "Library", "SmartFormat" } };
var str = sf.Format("Composed with {Library1}.", data);
Console.WriteLine(str);
// 打印:Composed with Error parsing format string: No source extension could handle the selector named "Library1" at 15
Composed with {Library1}.
---------------^.
}
处理特殊字符 {
和 }
默认情况下,SmartFormat 会将 {
和 }
两个符号识别为占位符,因此我们不能通过转义等方式打印 {
和 }
符号,也就是,我们想打印出这两个符号,而不是被识别为占位符,以下方法是无效的:
"{{} is pig."
"{\"{\"} is nice."
为了在字符串中直接打印这两个符号,有两种办法。
一种是自定义占位符映射对应的符号。
var sf = Smart.CreateDefaultSmartFormat();
sf.Settings.Formatter.ErrorAction = FormatErrorAction.MaintainTokens;
var dict1 = new Dictionary<string, string> { { "LF", "{" }, { "RF", "}" } };
var dict2 = new Dictionary<string, string> { { "dict2key", "dict2 Value" } };
var value = sf.Format("{LF} {dict2key} {RF}", (dict1, dict2));
value.Dump();
// 打印 { dict2 Value }
缺点是麻烦,阅读性比较差。
另一种是设置兼容性 SmartSettings.StringFormatCompatibility = true
。
var sf = Smart.CreateDefaultSmartFormat();
sf.Settings.Formatter.ErrorAction = FormatErrorAction.MaintainTokens;
sf.Settings.Parser.ErrorAction = ParseErrorAction.ThrowError;
sf.Settings.StringFormatCompatibility = true;
var dict2 = new Dictionary<string, string> { { "dict2key", "dict2 Value" } };
var value = sf.Format(" {{dict2key}} ", (dict2));
value.Dump();
// 打印: {dict2key}
var value = sf.Format("{{ {dict2key} }}", (dict2));
// 打印:{ dict2 Value }
SmartFormat 还支持本地化货币、时间、格式化表达式等多种强大的功能。
文章评论