Humanizer Truncator 截断器使用指南:用 3 个静态实例与 4 种扩展方法精确控制字符串长度
发布时间:2026/9/25 5:14:44来源:尧图网络
开发工具【免费下载链接】HumanizerHumanizer meets all your .NET needs for manipulating and displaying strings, enums, dates, times, timespans, numbers and quantities项目地址https://gitcode.com/gh_mirrors/hu/Humanizer点击查看免费下载导读在 .NET 项目中展示长文本如文章摘要、日志前缀、UI 列表项时经常需要按长度截断字符串而简单Substring会生硬切词、破坏可读性。Humanizer 提供了Truncator静态类它集中托管了多种ITruncator截断策略实现配合TruncateExtensions扩展方法即可一行代码完成按固定长度 / 固定字母数字数 / 固定单词数的截断并支持从左端或右端截断、自定义省略号。读完本文你将掌握Truncator全部公开属性FixedLength、FixedNumberOfCharacters、FixedNumberOfWords的语义差异、底层实现原理以及如何在实战中组合扩展方法重载实现精确控制。本文以版本化 API 文档 Humanizer.Truncator.md 为核心骨架并深入其源码与测试用例进行佐证。一、Truncator 类总览一个静态的截断器工厂Truncator是一个public static class本身不持有字符串处理逻辑其职责是Gets a ITruncator——为调用方提供开箱即用的截断器实例。所有属性均为只读静态属性在首次访问时实例化具体的内部截断器类见 Truncator.cspublic static class Truncator { public static ITruncator FixedLength { get; } new FixedLengthTruncator(); public static ITruncator FixedNumberOfCharacters { get; } new FixedNumberOfCharactersTruncator(); public static ITruncator FixedNumberOfWords { get; } new FixedNumberOfWordsTruncator(); // 当前源码中额外提供的两个动态截断器见第六节 public static ITruncator DynamicLengthAndPreserveWords { get; } new DynamicLengthAndPreserveWordsTruncator(); public static ITruncator DynamicNumberOfCharactersAndPreserveWords { get; } new DynamicNumberOfCharactersAndPreserveWordsTruncator(); }从源码结构看该类的设计模式非常清晰策略模式 静态工厂。具体的截断算法被封装在各自独立的内部类中而Truncator只负责暴露统一入口使调用方无需了解具体类名即可切换策略。2.10.1 版本文档即关联文档只公开了前三个属性后两个动态截断器是当前仓库新增的增强能力。三个文档化属性的签名速查属性返回类型语义Truncator.FixedLengthITruncator按固定字符长度截断忽略单词边界Truncator.FixedNumberOfCharactersITruncator按固定数量的字母/数字字符截断跳过空格与标点Truncator.FixedNumberOfWordsITruncator按固定数量的单词截断三者统一实现自 ITruncator 接口见 ITruncator.cspublic interface ITruncator { string? Truncate(string? value, int length, string? truncationString, TruncateFrom truncateFrom TruncateFrom.Right); }四个参数的职责如下value待截断的字符串可为null返回nulllength结果允许的最大长度包含截断指示符即省略号所占长度也算在内truncationString截断指示符如…、...、---可为null或空串truncateFrom从哪一端截断TruncateFrom.Right默认保留开头或TruncateFrom.Left保留结尾枚举定义见 TruncateFrom.cs。二、Truncator.FixedLength最直接的固定长度截断这是最常用的截断器语义是硬截断到指定字符数。其实现见 FixedLengthTruncator.cs核心行为可归纳为四条规则输入为null时返回null空串或长度不超过length时原样返回若truncationString为null或自身长度已超过length则直接截取value[..length]右端截断或value[^length..]左端截断不带省略号否则从右侧截断时结果为value[0..(length - truncationString.Length)] truncationString即正文 省略号拼接到恰好length从左侧截断时结果为truncationString value[value.Length - length truncationString.Length..]即省略号 结尾正文。文档中对该属性的描述为 Fixed length truncator。实际调用时它遵循默认省略号…例如测试 TruncatorTests.cs 中验证的Text longer than truncate length.Truncate(10) // Text long… Text with length equal to truncate length.Truncate(41) // 原样返回从左侧截断时效果为…te lengthTruncate(10, Truncator.FixedLength, TruncateFrom.Left)。三、Truncator.FixedNumberOfCharacters按字母/数字计数截断与FixedLength不同该截断器的length只统计char.IsLetterOrDigit命中的字符字母与数字空格、标点、符号不计入。其实现见 FixedNumberOfCharactersTruncator.cs关键逻辑先遍历统计字母数字总数若不超过length则原样返回需要截断时从右或从左扫描每遇到一个字母/数字字符计数 1当alphaNumericalCharactersProcessed truncationString.Length length时在此处拼接截断指示符左端截断时同样按字母数字计数且能正确处理字符串中的多余空格测试用例Text with additional spaces在length10时得到Text with。该特性非常适合处理包含特殊符号或空格的文本确保正文内容真正被限制在指定容量内。测试示例Text with more characters than truncate length.Truncate(10, Truncator.FixedNumberOfCharacters) // Text with m…左端截断示例Text with strange characters ^$(*^ and more ^$**)% 在length10时得到…rs ^$(*^ and more ^$**)% ——注意开头的标点^$(*^不计入 10 个字符配额。四、Truncator.FixedNumberOfWords按单词数截断该截断器以char.IsWhiteSpace含空格、\n、\r、\t为单词分隔符进行计数实现见 FixedNumberOfWordsTruncator.cs。其实现细节值得关注先无分配地遍历一遍统计单词数用wasWhiteSpace标志位跳过连续空白若单词数不超过length则原样返回右端截断时TruncateFromRight从头部逐个字符扫描数满length个单词后在下一个空白处截断并拼接省略号左端截断时TruncateFromLeft从尾部反向扫描保留末尾length个完整单词两种方向的实现都会正确处理首尾多余空白测试用例Text with whitespace at the end 左端截断得到…whitespace at the end尾部空格被清除。典型行为引用测试用例Text with more words than truncate length.Truncate(4, Truncator.FixedNumberOfWords) // Text with more words… Words are\nsplit\rby\twhitespace.Truncate(4, Truncator.FixedNumberOfWords) // Words are\nsplit\rby… // 换行、回车、Tab 均为合法分隔符 Text with more words than truncate length.Truncate(4, Truncator.FixedNumberOfWords, TruncateFrom.Left) // …words than truncate length五、配套扩展方法四种重载让调用一步到位Truncator的属性通常不直接调用而是通过 TruncateExtensions.cs 中的Truncate()扩展方法使用。共有四个重载参数层层递进重载签名默认行为适用场景Truncate(this string?, int length)默认省略号…Truncator.FixedLength 右端截断最简用法Truncate(this string?, int length, ITruncator, TruncateFrom Right)自定义截断器 方向省略号为…切换策略Truncate(this string?, int length, string? truncationString, TruncateFrom Right)自定义省略号 FixedLength自定义指示符Truncate(this string?, int length, string? truncationString, ITruncator, TruncateFrom Right)全参数自由组合完全控制底层实现最终重载会先校验truncator非空然后委托给truncator.Truncate(input, length, truncationString, from)input null时直接返回null。扩展方法的 XML 文档给出了可复制的示例This is a long string.Truncate(10) // This is a… This is a long string.Truncate(10, ...) // This is... This is a long string.Truncate(15, --) // This is a lo-- This is a long string.Truncate(10, ..., TruncateFrom.Left) // ...string This is a long string.Truncate(10, Truncator.FixedNumberOfWords) // This is…关于length的语义提醒所有重载的length均指结果字符串的总长度含截断指示符。测试中Text longer than truncate length.Truncate(10, ...)得到Text lo...7 个正文 3 个点号 10可见省略号占用配额。当truncationString本身比length还长时各截断器会回退为不带省略号的纯子串截取例如Te或测试用例12中验证了length2且省略号为...时返回动态截断器或Te固定长度截断器。六、从当前源码看截断器家族两个动态策略补充虽然 2.10.1 版 API 文档只收录了三个属性但当前仓库的Truncator已扩展至五个成员。作为对文档的补充简要说明新增的两个动态截断器实现文件位于 DynamicLengthAndPreserveWordsTruncator.cs 与 DynamicNumberOfCharactersAndPreserveWordsTruncator.csTruncator.DynamicLengthAndPreserveWords按字符长度截断但不切断单词——若截断点落在单词中间则回退到最近空格整词丢弃后接省略号若连一个完整词都放不下则只返回省略号测试A Text ... the last word fit在length1时得到…length2时得到A…Truncator.DynamicNumberOfCharactersAndPreserveWords结合了字母数字计数与保词策略左端截断时省略号置于前如…length。这两个策略适合对可读性要求极高的 UI 场景新闻摘要、面包屑、文件名显示它们与文档化的三个策略共同构成了 Humanizer 完整的截断能力矩阵。七、测试验证行为规格的一手证据Humanizer 对截断行为的规格定义集中体现在 TruncatorTests.cs共 18 组理论测试Theory覆盖全部截断器 × 省略号 × 方向的组合。值得注意的边界用例空与 nullnull→null→短串原样返回长度相等字符串长度等于length时不截断、不加省略号空白处理固定单词数截断器把\n、\r、\t都当作单词分隔符左端截断会清理残留尾部空格省略号超长指示符长于length时回退为纯子串单个超长单词如Textual with ...这种首个单词超过length的情况动态截断器返回…而非强行切词。这些用例是验证你自行扩展ITruncator行为的最佳参照任何自定义截断器都应至少通过同类边界测试。八、实战选型建议按业务需求选择策略最简摘要截断直接text.Truncate(50)默认省略号 固定长度代价是可能切在单词中间保证单词完整text.Truncate(50, Truncator.DynamicLengthAndPreserveWords)宁可缩短正文也不切断单词对符号敏感的计数文本含大量标点/空格时用Truncator.FixedNumberOfCharacters确保字母数字内容达到配额按语义单元截断如日志条目或标签列表用Truncator.FixedNumberOfWords保留结尾信息如文件路径的扩展名、版本号传TruncateFrom.Left从左端截断保留尾部需要自定义指示符如...、…、[更多]使用带truncationString参数的重载注意指示符长度计入length配额。需要说明的是以上均为对当前仓库源码与测试的直接总结具体版本以你实际引用的 Humanizer 包为准本文关联文档对应 2.10.1动态截断器属后续版本新增能力。结语Truncator是 Humanizer 字符串处理体系中一个小而精的组件静态属性封装策略、扩展方法简化调用、ITruncator接口支持自定义扩展。理解其length配额语义含省略号、字母数字计数规则与左右截断方向即可在各种展示场景中写出既简洁又可读的截断逻辑。深入阅读 Truncator.cs、TruncateExtensions.cs 与 TruncatorTests.cs还能进一步掌握 Humanizer 在字符串处理上的工程化设计风格。赞分享开发工具【免费下载链接】HumanizerHumanizer meets all your .NET needs for manipulating and displaying strings, enums, dates, times, timespans, numbers and quantities项目地址https://gitcode.com/gh_mirrors/hu/Humanizer点击查看免费下载相关推荐在 Loki 中嵌入 GopherLua用 Go 编写 Lua 5.1 虚拟机与编译器的完整实战指南在 Loki 中嵌入 GopherLua用 Go 编写 Lua 5.1 虚拟机与编译器的完整实战指南 GopherLua 是一个用 Go 语言实现的 Lua开发工具Humanizer.ITruncator 接口完全指南掌握 Humanizer 的字符串截断扩展点Humanizer.ITruncator 接口完全指南掌握 Humanizer 的字符串截断扩展点 导读 本文围绕 Humanizer 的 ITruncato开发工具Humanizer ITruncator 接口深度解析.NET 字符串截断的四种内置策略与自定义扩展机制Humanizer ITruncator 接口深度解析.NET 字符串截断的四种内置策略与自定义扩展机制 Humanizer 库中的 ITruncator 接开发工具上一篇Configu配置策略框架预防应用程序错误配置的完整指南下一篇如何使用.htaccess优化远程教育平台提升在线学习体验的7个实用技巧创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网