如何在Dot Liquid与C#中创建自定义金额格式化过滤器
Dot Liquid 自定义数字千分位格式化方案
针对将数值格式化为千分位用.、小数分隔用,的欧陆金额格式需求,不需要依赖第三方扩展,直接按以下步骤实现自定义过滤器即可,代码可直接复用。
具体实现步骤
- 编写自定义过滤器静态类
Dot Liquid的过滤器规则为:静态类中的公共静态方法会被识别为可用过滤器,方法第一个参数为模板传入的待处理值,后续参数为过滤器调用时可传入的自定义参数。using DotLiquid; using System.Globalization; public static class CustomLiquidFilters { /// <summary> /// 格式化数字为千分位.、小数分隔,的欧陆格式,默认保留2位小数 /// </summary> /// <param name="input">待格式化的数值(支持数字类型、字符串类型的数字)</param> /// <param name="decimalDigits">保留小数位数,默认2位</param> public static string EuroNumber(object input, int decimalDigits = 2) { // 空值、非数字兼容处理,避免渲染报错 if (input == null || !decimal.TryParse(input.ToString(), NumberStyles.Any, CultureInfo.InvariantCulture, out decimal numValue)) { return input?.ToString() ?? string.Empty; } // 德式文化默认规则正好匹配:千分位分隔符为.,小数分隔符为, var deCulture = new CultureInfo("de-DE"); return numValue.ToString($"N{decimalDigits}", deCulture); } } - 注册过滤器到Dot Liquid引擎
在程序启动初始化阶段执行一次注册即可,全局生效:Template.RegisterFilter(typeof(CustomLiquidFilters)); - 模板中调用过滤器
渲染表格单元格时,直接对JSON传入的数字字段套用过滤器即可:
传入值为<table> <tr> <td>{{ OrderAmount | EuroNumber }}</td> </tr> </table>40000.50时,渲染结果为40.000,50,完全匹配预期。如果需要调整小数位数,调用时传参即可,比如保留3位小数写作{{ OrderAmount | EuroNumber: 3 }}。
补充说明
- Dot Liquid内置的
money过滤器默认绑定美元格式规则,且要求传入值为特定的金额对象类型,JSON反序列化得到的普通数字、字符串类型无法触发正确格式化逻辑,不适合当前场景。 - 如果需要调整为其他区域的数字格式,只需替换
CultureInfo的初始化参数即可,比如中式千分位格式(逗号做千分位、点做小数位)替换为new CultureInfo("zh-CN")。 - 上述过滤器代码无额外依赖,兼容Dot Liquid 2.0及以上所有版本,可以直接拷贝到项目中复用。
内容的提问来源于stack exchange,提问作者Tasos G.
相关产品推荐
相关产品推荐

