ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Humanizer 字符串大小写转换指南:CasingExtensions.ApplyCase 与 LetterCasing 详解

Humanizer 字符串大小写转换指南:CasingExtensions.ApplyCase 与 LetterCasing 详解 开发工具【免费下载链接】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 是一个面向 .NET 的字符串、枚举、日期与数字处理库其中CasingExtensions提供了一套统一入口ApplyCase用于把任意字符串快速切换到四种目标大小写风格Title、AllCaps、LowerCase、Sentence。本文以 2.11.10 版本快照中的 CasingExtensions API 文档 为骨架结合同版本源码与测试讲清该 API 的用法、枚举取值、底层变换器原理以及文化敏感陷阱读完即可在项目里安全地用它统一输出文案的大小写。CasingExtensions 类概述CasingExtensions是 Humanizer 提供的静态扩展类其职责正如 XML 文档注释所述ApplyCase method to allow changing the case of a sentence easily——用一个方法轻松改变句子的大小写public static class CasingExtensions类定义位于 src/Humanizer/CasingExtensions.cs它不依赖实例状态全部通过扩展方法形式暴露属于典型的 Humanizer 扩展方法入口 设计。在 2.11.10 版本中该类仅提供一个核心方法ApplyCase定义如下public static string ApplyCase(this string input, Humanizer.LetterCasing casing);参数说明参数类型说明inputstring待转换的输入字符串不允许为 nullcasingLetterCasing期望的目标大小写风格枚举返回值应用指定大小写风格后的新字符串。该方法不会原地修改input而是返回一个全新的字符串。LetterCasing 枚举四种大小写风格LetterCasing是ApplyCase唯一的参数类型定义于 src/Humanizer/LetterCasing.cs其四个字段在 LetterCasing API 参考 中有完整罗列枚举值数值行为示例Title0每个单词首字母大写SomeString→Some StringAllCaps1全部字母大写SomeString→SOME STRINGLowerCase2全部字母小写SomeString→some stringSentence3仅首字符大写其余保持不变SomeString→Some string注意枚举值的数值顺序Title为 0默认值AllCaps为 1LowerCase为 2Sentence为 3。由于Title是默认值调用时漏传枚举会静默落入 Title 行为建议总是显式指定。ApplyCase 源码实现一次 switch 分发到四种变换器ApplyCase的实现非常精简是一个针对LetterCasing的 switch 表达式将每种枚举值映射到 Transformer 命名空间下对应的文化敏感变换器见 src/Humanizer/CasingExtensions.cs#L29-L37public static string ApplyCase(this string input, LetterCasing casing) casing switch { LetterCasing.Title input.Transform(To.TitleCase), LetterCasing.LowerCase input.Transform(To.LowerCase), LetterCasing.AllCaps input.Transform(To.UpperCase), LetterCasing.Sentence input.Transform(To.SentenceCase), _ throw new ArgumentOutOfRangeException(nameof(casing)) };从实现可以确认三个关键事实默认分支抛异常传入未定义的LetterCasing值时例如(LetterCasing)42会抛出ArgumentOutOfRangeException异常参数名为casing。这与 CasingExtensions.cs 头部 XML 注释中声明的ArgumentOutOfRangeException完全一致。内部复用To变换器门户ApplyCase本身不实现任何大小写逻辑而是委托给To.TitleCase、To.LowerCase、To.UpperCase、To.SentenceCase四个静态属性定义于 src/Humanizer/Transformer/To.cs#L26-L50。这意味着input.ApplyCase(LetterCasing.Title)与input.Transform(To.TitleCase)走的是同一条执行路径。文化敏感变换器这四个属性类型均为ICulturedStringTransformer即带CultureInfo参数的变换器。无参调用时内部使用CultureInfo.CurrentCulture。四种行为逐项验证测试用例确认测试文件 tests/Humanizer.Tests/CasingTests.cs 为四种模式提供了精确的输入-输出对可直接作为行为契约Title 模式ApplyCase(LetterCasing.Title)lower case statement Lower Case Statement Sentence casing Sentence Casing honors UPPER case Honors UPPER Case Title Case Title Case title case (with parenthesis) Title Case (With Parenthesis)关键观察全大写单词UPPER被保留原样视为缩写词/首字母缩略词括号内的单词也会被单独首字母大写。Sentence 模式ApplyCase(LetterCasing.Sentence)lower case statement Lower case statement Sentence casing Sentence casing honors UPPER case Honors UPPER case注意 Sentence 模式只动第一个字符后续字符一概不改与常见 每句首字母大写 的句子规范化工具不同。LowerCase 与 AllCaps 模式// LowerCase Sentence casing sentence casing No honor for UPPER case no honor for upper case // AllCaps lower case statement LOWER CASE STATEMENT Sentence casing SENTENCE CASING两种模式分别直接调用culture.TextInfo.ToLower/ToUpper全量转换见 ToLowerCase.cs 与 ToUpperCase.cs语义上等价于string.ToLowerInvariant()之外的文化敏感版本。底层原理ToTitleCase 的单词边界与特殊规则Title是四种模式中实现最复杂的其完整逻辑在 src/Humanizer/Transformer/ToTitleCase.cs值得展开ASCII 快速路径输入全部为 ASCII 时走无分配/少分配的快速扫描TryTransformAscii一旦遇到非 ASCII 字符则回退到正则路径WordPattern (\w|[^\u0000-\u007F])?\w*ToTitleCase.cs#L8支持带撇号单词如dont的正确切分。全大写单词不动AllAsciiCapitals/AllCapitals判断当前单词是否全大写若是则原样保留——这就是honors UPPER case中UPPER不被改写的原因。小词不首字母大写当单词位于句子中间且属于冠词/连词/介词列表时保持小写不改写。完整列表见 ToTitleCase.cs#L232-L238a, an, as, at, by, if, in, of, on, or, so, to, up与and, but, for, nor, off, the, via, yet。因此ApplyCase(LetterCasing.Title)并非严格 每个词都大写——例如the cat and the dog中间的and与the会保持小写。文化敏感 ASCII 转换对于土耳其语tr与阿塞拜疆语az文化ASCII 字母的大小写转换走TextInfo.ToUpper/ToLower以正确处理无点 iı/I等特殊规则其他文化走纯 ASCII 算术转换见 ToTitleCase.cs#L142-L144。因此标题模式本质上是 单词边界识别 缩写词保护 小词豁免 文化敏感大小写 的组合并不实现任何特定编辑排版规范如 AP/Chicago 风格需要严格遵循某套 style guide 时应自行再加工。与 Humanize 等其他字符串 API 的组合使用在 2.11.10 的实战文档 strings-and-casing.mdx 中LetterCasing还与Humanize等 API 组合使用其可运行示例见 scenarios-strings/Program.cs// 先切分标识符再统一大小写Humanize 自带 LetterCasing 重载 AssertEqual(Customer order history, CustomerOrderHistory.Humanize()); AssertEqual(Customer Order History, CustomerOrderHistory.Humanize(LetterCasing.Title)); // 需要完全控制展示格式时用 ApplyCase 做二次加工 customer order history.ApplyCase(LetterCasing.Sentence); // Customer order history // 等价的文化敏感变换器写法 AssertEqual(Order History, order history.Transform(To.TitleCase));实践建议标识符→展示文本优先用Humanize()先决定词边界需要明确展示大小写时传入LetterCasing重载或再用ApplyCase兜底——正如 scenarios 文档 Orientation 一节强调的casing 与标识符转换解决的是不同问题先在决定词边界之后再应用LetterCasing。Transform与ApplyCase的差异在于前者可串联多个变换器、接受显式CultureInfo参数见 To.cs#L17-L18后者是面向LetterCasing枚举的便捷封装。文化敏感性与确定性输出由于ApplyCase的四种模式底层全部使用ICulturedStringTransformer输出依赖当前线程的CultureInfo.CurrentCulture。需要确定性输出尤其是日志、持久化文案、多语言测试时应注意不要假设 Title/Sentence 在不同文化下行为一致例如土耳其语与阿塞拜疆语文化下 ASCII 大小写映射存在特殊规则ToTitleCase中专门对tr/az启用了TextInfo路径。优先显式文化需要固定文化时用input.Transform(To.TitleCase, culture)这类带CultureInfo的变换器重载而不是依赖进程级配置。版本快照行为差异本文描述的是 2.11.10 快照行为scenarios 文档的版本说明明确指出 Humanizer 3 改变了若干分隔符与无字母边界用例若需精确复现旧行为应针对所选版本单独验证见 strings-and-casing.mdx 的 Version notes 一节。小结CasingExtensions.ApplyCase是 Humanizer 字符串大小写功能的统一入口一个枚举参数 一个扩展方法即可覆盖 Title/AllCaps/LowerCase/Sentence 四种风格其实现委托给文化敏感的To变换器默认枚举值为 0 对应的Title非法枚举值抛ArgumentOutOfRangeException底层ToTitleCase还内置了全大写缩写词保护与冠词/连词/介词豁免规则。在需要固定输出时请结合显式CultureInfo或Transform的受文化重载使用并在跨版本升级后重新跑一遍 CasingTests 中的行为用例。赞分享开发工具【免费下载链接】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 字符串大小写转换指南全面掌握 CasingExtensions.ApplyCase 与 LetterCasingHumanizer 字符串大小写转换指南全面掌握 CasingExtensions.ApplyCase 与 LetterCasing CasingExtens开发工具ZITADEL QR Code 转 SVG 实现解析用 CSS Class 替代内联样式让 TOTP 验证码兼顾主题化与 CSP 合规ZITADEL QR Code 转 SVG 实现解析用 CSS Class 替代内联样式让 TOTP 验证码兼顾主题化与 CSP 合规 本篇以 intern开发工具Humanizer 字符串大小写转换详解ApplyCase 方法与 LetterCasing 枚举全解析Humanizer 字符串大小写转换详解ApplyCase 方法与 LetterCasing 枚举全解析 本文围绕 Humanizer 中 CasingExt开发工具上一篇攻克Mantine Carousel的Embla类型难题从报错到修复的完整指南下一篇UIEffect预设系统深度解析运行时与编辑器预设的完整用法创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表