Humanizer Truncator 类全解析:从固定长度到保词截断的完整指南
开发工具【免费下载链接】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点击查看免费下载导读Humanizer.Truncator是 Humanizer 库中用于获取字符串截断器ITruncator的静态入口类它把把过长的字符串截断为指定长度这一常见需求抽象为五种可组合的截断策略配合TruncateFrom方向枚举几乎可以覆盖 UI 摘要、日志裁剪、文本预览等全部截断场景。阅读本文后你将掌握Truncator五个静态属性的差异与适用场景、ITruncator接口的调用契约以及如何结合Truncate扩展方法与自定义截断字符串实现精确可控的字符串截断。1. 概览Truncator 是什么Truncator是一个public static class本身不参与任何截断逻辑计算它的职责是集中暴露一组已实例化好的截断器供TruncateExtensions扩展方法按需选用见 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(); }注本文对应的 2.11.10 版 API 文档 Humanizer.Truncator.md 中收录了前三个属性FixedLength、FixedNumberOfCharacters、FixedNumberOfWords当前仓库源码在此基础上还提供了两个动态截断器DynamicLengthAndPreserveWords与DynamicNumberOfCharactersAndPreserveWords本文一并覆盖。所有属性均为只读静态属性可在程序任意位置直接访问同一截断器实例被全局共享。所有截断器都实现同一个接口ITruncator定义见 ITruncator.cspublic interface ITruncator { string? Truncate(string? value, int length, string? truncationString, TruncateFrom truncateFrom TruncateFrom.Right); }四个参数的含义分别是参数类型说明valuestring?待截断的字符串可为null返回nulllengthint截断后的目标长度上限包含截断指示符如省略号所占长度truncationStringstring?截断指示符例如…、...或任意自定义串传null视作空串truncateFromTruncateFrom截断方向默认Right从右侧截断2. 核心属性逐个拆解2.1 Truncator.FixedLength —— 固定长度截断器public static Humanizer.ITruncator FixedLength { get; }返回值类型ITruncator。该属性返回FixedLengthTruncator实例按字符数硬性截断到指定长度实现见 FixedLengthTruncator.cs。其行为要点value为null时返回null空串或长度不超过length时原样返回若truncationString为null或其长度大于length则不带指示符地截断从右截断取value[..length]从左截断取value[^length..]否则右截断结果为value[0, length - truncationString.Length] truncationString左截断为truncationString value[length - truncationString.Length..]。典型用例来自 TruncatorTests.cs 的测试数据short text.Truncate(20, trunc) // short text未超长原样返回 Text longer than truncate length.Truncate(10, trunc) // Text trunc10 - 5 5 个字符 trunc Text longer than truncate length.Truncate(10, very long truncation string) // Text longe指示符过长时忽略指示符2.2 Truncator.FixedNumberOfCharacters —— 固定字母/数字数量截断器public static Humanizer.ITruncator FixedNumberOfCharacters { get; }返回值类型ITruncator。该属性返回FixedNumberOfCharactersTruncator实例特点是只统计字母和数字char.IsLetterOrDigit空格、标点等不计入长度配额实现见 FixedNumberOfCharactersTruncator.cs。从源码可以推断其处理流程先从左到右统计字母/数字个数若alphaNumericalCount length则原样返回需要截断时从左Right方向或右Left方向开始逐字符累计字母/数字个数当已计数 truncationString.Length length时在此处拼接指示符并返回truncationString为null时按空串处理指示符长度超过length时同样退化为无指示符截断。Text with more characters than truncate length.Truncate(10, Truncator.FixedNumberOfCharacters) // Text with m…2.3 Truncator.FixedNumberOfWords —— 固定单词数量截断器public static Humanizer.ITruncator FixedNumberOfWords { get; }返回值类型ITruncator。该属性返回FixedNumberOfWordsTruncator实例按单词数截断实现见 FixedNumberOfWordsTruncator.cs。源码细节单词以char.IsWhiteSpace空格、\n、\r、\t等为分隔符连续空白只算一次分隔且统计过程不分配数组遍历字符完成右截断在数到第length个单词的结尾空白处切分例如Text with more words than truncate length.Truncate(4, Truncator.FixedNumberOfWords)得到Text with more words…左截断从字符串末尾向前扫描在第length个单词边界处切分并前置指示符测试 TruncatorTests.cs 还验证了多空白分隔场景Words are\nsplit\rby\twhitespace.Truncate(4, Truncator.FixedNumberOfWords)输出Words are\nsplit\rby…。2.4 动态截断器保留完整单词除文档收录的三个属性外当前源码还提供两个智能截断器见 Truncator.csDynamicLengthAndPreserveWords按字符长度截断但如果切断点落在单词中间则整词丢弃并附上指示符左截断时若剩余空间放不下完整单词则只返回指示符实现见 DynamicLengthAndPreserveWordsTruncator.cs。DynamicNumberOfCharactersAndPreserveWords按字母/数字个数配额截断同时保证不切半单词——计数只统计字母/数字单词边界用空白判定任何一方装不下完整单词时只返回指示符实现见 DynamicNumberOfCharactersAndPreserveWordTruncator.cs。来自 TruncatorTests.cs 的验证用例Text longer than truncate length.Truncate(10, Truncator.DynamicLengthAndPreserveWords) // Text…longer 被整体丢弃 Textual with … starting word longer than ….Truncate(4, Truncator.DynamicLengthAndPreserveWords) // …放不下完整单词 A Text with … the last word fit.Truncate(2, Truncator.DynamicLengthAndPreserveWords) // A… Text with more characters than truncate length.Truncate(10, Truncator.DynamicNumberOfCharactersAndPreserveWords) // Text with…3. TruncateFrom截断方向TruncateFrom是一个二值枚举定义见 TruncateFrom.cs成员含义Left从字符串左侧开头截断保留尾部内容指示符前置Right从字符串右侧结尾截断保留开头内容指示符后置默认值方向与指示符的组合效果来自 TruncateExtensions.cs 的文档示例This is a long string.Truncate(10, Truncator.FixedLength, TruncateFrom.Left) // …ng string This is a long string.Truncate(10, …, Truncator.FixedNumberOfWords, TruncateFrom.Left) // … string This is a long string.Truncate(10, ..., TruncateFrom.Left) // ...string4. 与 Truncate 扩展方法的协作方式Truncator类通常不会单独使用而是作为 TruncateExtensions.cs 中四个Truncate重载的参数。这些重载构成了从最简用法到完全自定义的阶梯重载签名默认行为input.Truncate(int length)使用默认指示符…与Truncator.FixedLength右截断input.Truncate(int length, ITruncator truncator, TruncateFrom from Right)自定义截断器指示符仍为…input.Truncate(int length, string? truncationString, TruncateFrom from Right)自定义指示符截断器固定为FixedLengthinput.Truncate(int length, string? truncationString, ITruncator truncator, TruncateFrom from Right)指示符、截断器、方向全部自定义最灵活最底层重载TruncateExtensions.cs会做空值校验input为null时返回nulltruncator为null时抛出ArgumentNullException随后把参数透传给truncator.Truncate(...)。[return: NotNullIfNotNull(nameof(input))]特性保证了空流式null-propagation场景下的可空性分析安全。几个贴近实战的组合示例// 1. 列表摘要保留前 3 个词加省略号 description.Truncate(3, ..., Truncator.FixedNumberOfWords); // Humanizer meets all... // 2. 目录/路径预览从左侧截断保留结尾 path.Truncate(20, …, Truncator.FixedLength, TruncateFrom.Left); // …e/truncation/Truncator.cs // 3. 摘要文本硬性 80 字符内且不切半单词 article.Truncate(80, …, Truncator.DynamicLengthAndPreserveWords); // … // 4. 统计字数场景按字母/数字配额截断且保留完整词 headline.Truncate(30, …, Truncator.DynamicNumberOfCharactersAndPreserveWords);5. 行为边界与注意事项综合源码与 TruncatorTests.cs 的 320 行测试矩阵使用时需要记住以下边界行为null 与空串所有截断器对null一律返回null对空串返回空串未超长输入只要实际长度/单词数/字母数不超过length一律原样返回不附加指示符指示符过长当truncationString.Length length时FixedLength与FixedNumberOfCharacters会直接忽略指示符做裸截断如Text longer than truncate length.Truncate(2, ...)输出Te配额包含指示符length是结果总长度上限指示符会占用配额所以指示符越长可保留的正文越短保词截断的特殊回退动态截断器在空间不足放不下任何完整单词时只返回指示符如…这是它们与固定截断器的最大行为差异单词定义单词以任意空白字符含换行、制表符、回车分隔连续空白不产生空单词。这些边界行为均有对应测试用例佐证例如 TruncatorTests.cs 中null指示符、超长指示符与空串指示符的组合验证。6. 如何验证与运行运行测试截断器行为由 TruncatorTests.cs 完整覆盖编号 01–21 的 Theory 用例包含全部五种截断器、自定义指示符、左右双向截断可在测试项目目录执行dotnet test验证查看公共 API 签名TruncateFrom枚举、ITruncator接口等公共成员均已纳入 API 基线快照见 PublicApiApprovalTest.Approve_Public_Api.DotNet8_0.verified.txt阅读源码所有截断器实现集中在 src/Humanizer/Truncation 目录扩展入口在 TruncateExtensions.cs方向枚举在 TruncateFrom.cs。结语Truncator用一组静态属性把截断策略与字符串操作解耦日常场景直接使用FixedLength精确、FixedNumberOfCharacters按字母/数字配额、FixedNumberOfWords按语义词数对排版要求高的场景改用两个动态截断器避免切半单词的观感问题。理解length包含指示符配额、TruncateFrom控制方向、指示符过长自动退化的三条核心规则即可在任意 .NET 项目中稳定复现可预期的截断结果。赞分享开发工具【免费下载链接】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点击查看免费下载相关推荐Humanizer 字符串截断完全指南Truncator 静态工厂与五种 ITruncator 策略源码解析Humanizer 字符串截断完全指南Truncator 静态工厂与五种 ITruncator 策略源码解析 导读 Humanizer https://lin开发工具Humanizer Truncator 截断器使用指南用 3 个静态实例与 4 种扩展方法精确控制字符串长度Humanizer Truncator 截断器使用指南用 3 个静态实例与 4 种扩展方法精确控制字符串长度 导读 在 .NET 项目中展示长文本如文章摘开发工具Humanizer 动态字母数字截断器 DynamicNumberOfCharactersAndPreserveWordsTruncator 完整解析按字母/数字计数并保留完整单词Humanizer 动态字母数字截断器 DynamicNumberOfCharactersAndPreserveWordsTruncator 完整解析按字母/开发工具上一篇3个步骤快速掌握ComfyUI UltimateSDUpscale图像放大技术下一篇终极指南如何在Expo项目中无需ejected集成React Native Skia创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Flink SQL 查询执行全解:从 sqlQuery()、executeSql() 到 TableResult 的源码级指南

Flink SQL 查询执行全解:从 sqlQuery()、executeSql() 到 TableResult 的源码级指南

大数据流处理批处理数据工程 【免费下载链接】flink 项目地址: https://gitcode.com/gh_mirrors/fli/flink 点击查看 免费下载 本文以 Flink 官方文档《Queries》为核心,系统讲解 Flink Table API 与 SQL 混合查询的完整生命周期:如何用 Tab…

2026/9/25 5:52:38 阅读更多 →
昇腾Atlas 300V 24G推理卡部署YOLO模型全流程指南

昇腾Atlas 300V 24G推理卡部署YOLO模型全流程指南

1. 先把“atlas 300v 24g”这个身份搞清楚1.1 名字里的每个字符都是信息atlas这个词,在AI硬件圈子里最近被问得非常多。有人拿着“atlas 300v 24g”的型号来问是不是运算加速卡,有人直接问atlas部署yolo行不行。说实话,这两个问题放在一起问&…

2026/9/25 5:52:38 阅读更多 →
Atlas 300V部署YOLO全流程实战:从环境搭建到推理调优

Atlas 300V部署YOLO全流程实战:从环境搭建到推理调优

Atlas 300V 24G是运算加速卡吗?这问题在群里至少见过十几次。直接给结论:是,它是一块面向AI推理场景的运算加速卡,芯片基于昇腾310P系列NPU,24G代表板载内存容量。但你没法像用游戏显卡那样直接上手,它不负…

2026/9/25 5:52:37 阅读更多 →

最新新闻

OpenCode 与 OpenCLAW 的 AI 模型配置:用 TaoToken 统一 Key 打通多工具调用

OpenCode 与 OpenCLAW 的 AI 模型配置:用 TaoToken 统一 Key 打通多工具调用

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 13:13:40 阅读更多 →
ORACLE 经验两则:Sys_Refcursor 与外部表 SKIP 的配置骨架

ORACLE 经验两则:Sys_Refcursor 与外部表 SKIP 的配置骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 13:13:40 阅读更多 →
Claude 在得物 App 数仓的深度集成与效能演进:TaoToken 统一 Key 通道配置实战

Claude 在得物 App 数仓的深度集成与效能演进:TaoToken 统一 Key 通道配置实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 13:13:40 阅读更多 →
WorkBuddy Enterprise 企业级 Agent 平台架构与 MCP 落地实践

WorkBuddy Enterprise 企业级 Agent 平台架构与 MCP 落地实践

1. 从「超级个体」到「超级团队」:这个平台到底在解决什么问题第一次看到「WorkBuddy Enterprise」这个名字,我脑子里蹦出来的第一个念头是:腾讯云终于把 CodeBuddy 那套东西往企业级方向推了。如果你最近半年一直在关注 Agent 开发这条线&am…

2026/9/25 13:13:40 阅读更多 →
Atlas 300V 24G实战:AI推理加速卡部署YOLO全流程

Atlas 300V 24G实战:AI推理加速卡部署YOLO全流程

很多人都为一个词搜过来:atlas。准确讲,搜到atlas又能和部署yolo扯上关系的,多半是盯上了华为Atlas 300V 24G这块卡。今天我不绕圈子,先说结论:Atlas 300V 24G确实是一块运算加速卡,但它更准确的定位&#…

2026/9/25 13:13:40 阅读更多 →
MySQL表空间传输:从原理到实战,把大表迁移从小时级压缩到分钟级

MySQL表空间传输:从原理到实战,把大表迁移从小时级压缩到分钟级

老规矩,先给结论:MySQL自带的表空间传输(Transportable Tablespace)功能,是处理“单表或一批表快速换实例”最好用的手段之一,尤其在数据量已经上到几十GB、几百GB,mysqldump导出导入慢到让人抓…

2026/9/25 13:12:40 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/25 11:15:26 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →