SmartFormat.NET 字符串格式化框架

2024年4月10日 324点热度 0人点赞 0条评论
内容纲要

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);

file

可以通过 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 还支持本地化货币、时间、格式化表达式等多种强大的功能。

痴者工良

高级程序员劝退师

文章评论