开发工具【免费下载链接】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点击查看免费下载OrdinalizeExtensions是 Humanizer 库中负责**序数化Ordinalization**的静态扩展类它把整数或数字字符串转换为表示有序序列中位置的序数形式例如1st、2nd、3rd、4th。本文围绕该类的全部重载方法展开深入讲解基础用法、语法性别GrammaticalGender与词形WordForm控制、区域文化CultureInfo定制并结合仓库源码src/Humanizer/OrdinalizeExtensions.cs、序数器注册表与各语言 YAML 配置src/Humanizer/Locales/es.yml揭示底层实现原理帮助你在多语言 .NET 应用中正确、完整地使用序数化能力。OrdinalizeExtensions 类概述OrdinalizeExtensions.cs 中定义的OrdinalizeExtensions是一个public static class全部方法均为this int、this long或this string上的扩展方法。其设计目标是把数字变成用于表示有序序列位置的序数词如 1st、2nd、3rd、4th并且天然支持本地化——不同语言、不同区域文化会得到完全不同的序数规则。从源码结构看该类内部维护了一个ConcurrentDictionarystring, OrdinalNumberFormatting缓存OrdinalizeExtensions.cs按文化名缓存序数数字格式化规则避免在高频调用时反复构造NumberFormatInfo。所有重载最终都汇聚到 Configurator.Ordinalizers 这个LocaliserRegistryIOrdinalizer注册表通过ResolveForCulture(culture)按文化解析出对应的序数器实现再调用其Convert(...)方法完成转换。支持的数据类型与重载全貌OrdinalizeExtensions提供了三类接收者receiver的重载this int number最常用的整型扩展例如1.Ordinalize()this long number64 位整型扩展可安全处理超出int范围的数值this string numberString字符串形式的数字扩展例如1.Ordinalize()。每类接收者又组合了三个可选参数维度参数类型作用genderGrammaticalGender输出词的语法性别Masculine / Feminine / NeutercultureSystem.Globalization.CultureInfo指定区域文化为null时使用当前线程的 UI 文化wordFormWordForm词形Normal / Abbreviation / Eifeler用于区分缩写与完整形式例如int接收者就有 8 个重载Ordinalize()、Ordinalize(WordForm)、Ordinalize(CultureInfo)、Ordinalize(CultureInfo, WordForm)、Ordinalize(GrammaticalGender)、Ordinalize(GrammaticalGender, WordForm)、Ordinalize(GrammaticalGender, CultureInfo)、Ordinalize(GrammaticalGender, CultureInfo, WordForm)long与string接收者的重载矩阵与之对齐。基础用法int、long 与 string 的序数化int 序数化最简单的调用直接作用于整数using Humanizer; 1.Ordinalize(); // 1st 2.Ordinalize(); // 2nd 3.Ordinalize(); // 3rd 4.Ordinalize(); // 4th无参int重载的实现等价于number.Ordinalize(CultureInfo.CurrentCulture)见 OrdinalizeExtensions.cs即使用当前线程文化。测试 OrdinalizeTests.cs 用大量[InlineData]验证了 0–1001 范围内的输出例如21→21st、22→22nd、23→23rd、110→110th、1001→1001st展示了英语序数规则的完整覆盖。string 序数化数字字符串同样可以直接序数化1.Ordinalize(); // 1st 21.Ordinalize(); // 21st 103.Ordinalize(); // 103rdstring 重载先通过int.Parse(numberString)解析数字见 OrdinalizeExtensions.cs再交给Configurator.Ordinalizer.Convert(...)。因此它受 int 取值范围限制测试 OrdinalizeStringRemainsIntBounded 明确验证了2147483648.Ordinalize()会抛出OverflowException。如果你的输入可能超过int.MaxValue应改用long重载。long 序数化64 位支持long重载是超出 32 位范围场景的正确选择2_147_483_651L.Ordinalize(); // 2147483651st long.MinValue.Ordinalize(); // -9223372036854775808th对应测试见 OrdinalizeLongNumber。其内部实现ConvertOrdinalizerOrdinalizeExtensions.cs会先判断解析出的序数器是否实现了ILongOrdinalizer接口若实现了则直接调用 64 位Convert(long, ...)否则将数值回退转换为int并在此过程中对超界值抛出NotSupportedException提示当前注册的序数器不支持 64 位值。这意味着旧的自定义IOrdinalizer实现依然兼容只是无法处理超 int 范围的值。测试 OrdinalizeLongNumberMatchesIntOverloadForEverySupportedLocale 还保证了对所有已支持区域文化21L.Ordinalize(culture)与21.Ordinalize(culture)输出一致。用 GrammaticalGender 控制输出词的语法性别GrammaticalGender.cs 定义了三个枚举值Masculine、Feminine、Neuter。在需要区分性别词形的语言中性别会直接影响序数后缀。文档与源码都给出了巴西葡萄牙语Brazilian Portuguese的经典示例1.Ordinalize(GrammaticalGender.Masculine); // 1º 1.Ordinalize(GrammaticalGender.Feminine); // 1ª1.Ordinalize(GrammaticalGender.Masculine)同样输出1º。而在英语等性别无关的语言中性别参数被忽略——测试 OrdinalizeNumberGenderIsImmaterial 验证了在en-US文化下number.Ordinalize(GrammaticalGender.Masculine)与number.Ordinalize(GrammaticalGender.Feminine)结果相同。从实现上看性别最终被传递给序数器的Convert(int, string, GrammaticalGender, ...)重载。以 SuffixOrdinalizer 为例它构造时接收三个性别后缀masculineSuffix、feminineSuffix、neuterSuffix并在Convert中按性别 switch 拼接后缀SuffixOrdinalizer.cs若某语言三种性别共用同一后缀则可使用单参数构造函数SuffixOrdinalizer(suffix)让三种性别统一。用 WordForm 区分完整形式与缩写形式WordForm.cs 定义了词的书写形态Normal单词的正常书写形式Abbreviation单词的缩短/缩写形式EifelerEifeler 规则形式卢森堡语中依据发音的变体规则。西班牙语是展示WordForm价值的最佳示例文档给出了完整对照1.Ordinalize(GrammaticalGender.Masculine, WordForm.Abbreviation) // 1.er — 如 Vivo en el 1.er piso 1.Ordinalize(GrammaticalGender.Masculine, WordForm.Normal) // 1.º — 如 Fui el 1º de mi promoción 1.Ordinalize(GrammaticalGender.Feminine, WordForm.Normal) // 1.ª — 如 Es 1ª vez que hago esto不带性别时同样可用1.Ordinalize(WordForm.Abbreviation); // 1.er 1.Ordinalize(WordForm.Normal); // 1.º测试 OrdinalizeNumberWithSpecifiedCultureAndSpecificForm 用[InlineData]交叉验证了es-ES下1的Normal/Abbreviation输出1.º/1.er以及en-US下两种词形均输出1st——说明英语不区分词形。西班牙语的这些规则并非硬编码在 C# 里而是来自语言配置 es.ymlordinal.numeric使用word-form-template引擎男性/中性在Abbreviation词形下对末位数字 1 和 3 追加.er后缀其余情况使用默认后缀.º/.ª。这正是 WordFormTemplateOrdinalizer 与末位数字后缀lastDigitSuffixes机制的配置级体现。用 CultureInfo 实现多语言序数化culture参数用于指定区域文化文档明确说明若为null则使用当前线程的 UI 文化。源码实现如 OrdinalizeExtensions.cs为null情况显式执行culture ?? CultureInfo.CurrentCulture再调用Configurator.Ordinalizers.ResolveForCulture(culture)解析对应文化的序数器。带 CultureInfo 的完整示例using System.Globalization; 1.Ordinalize(new CultureInfo(es-ES)); // 1.º 21.Ordinalize(new CultureInfo(en-US)); // 21st // 结合性别与词形 1.Ordinalize(GrammaticalGender.Masculine, new CultureInfo(es-ES), WordForm.Abbreviation); // 1.er 1.Ordinalize(GrammaticalGender.Masculine, new CultureInfo(es-ES), WordForm.Normal); // 1.º字符串接收者用法一致1.Ordinalize(new CultureInfo(es-ES), WordForm.Abbreviation)→1.er。数字字符串的本地化解析与纯int/long重载不同string 重载在传入culture时会使用该文化解析数字字符串ParseOrdinalNumber(numberString, resolvedCulture)等价于int.Parse(numberString, culture)OrdinalizeExtensions.cs。这意味着像١阿拉伯-印度数字这类带本地数字字符的输入可以按对应文化解析反之long重载则会用文化的NumberFormatInfo把数值格式化为数字字符串FormatOrdinalNumberString再交给序数器拼接后缀。测试 OrdinalizeStringParsingRespectsCulture 验证了(-1).ToString(culture).Ordinalize(culture) (-1).Ordinalize(culture)的一致性。负数的序数化负数同样被支持(-1).Ordinalize(culture)输出!1stOrdinalizeTests.cs。序数器对负数的处理策略由配置控制——WordFormTemplateOrdinalizer.NegativeNumberMode 定义了三种模式None保留负数原样格式化、AbsoluteInvariant用不变文化重排绝对值、AbsoluteCulture用目标文化重排绝对值。例如es.yml中西班牙语设置negativeNumberMode: absolute-culture测试 OrdinalizeLongMinValueUsesCultureSpecificRules 因而验证了long.MinValue.Ordinalize(new CultureInfo(es-ES), WordForm.Normal)输出9223372036854775808.º负号消失、绝对值按西班牙语格式化而ca-ES输出9223372036854775808è。底层实现原理从扩展方法到本地化序数器理解整条调用链有助于你按需定制序数化行为入口OrdinalizeExtensions的各个重载是唯一入口负责解析/格式化数字字符串、解析文化并把调用委托给Configurator见 src/Humanizer/OrdinalizeExtensions.cs。注册表解析Configurator.Ordinalizers 是LocaliserRegistryIOrdinalizer其具体实现是 OrdinalizerRegistry默认回退到DefaultOrdinalizer同时通过OrdinalizerRegistryRegistrations.Register(this)为各区域文化注册对应序数器。序数器实现src/Humanizer/Localisation/Ordinalizers 目录下定义了多种实现策略DefaultOrdinalizer基类默认原样返回数字字符串子类可覆写SuffixOrdinalizer按性别拼接固定后缀ModuloSuffixOrdinalizer按数字模运算规则匹配后缀TemplateOrdinalizer按模板模式生成支持精确替换、精确后缀、末位数字后缀WordFormTemplateOrdinalizer在模板基础上再按Normal/Abbreviation词形区分并支持负数模式见上文NumberWordSuffixOrdinalizer在数字转单词ToWords结果后追加序数后缀。接口契约IOrdinalizer.cs 定义了 4 个Convert重载默认形式 / 词形 / 性别 / 性别词形并扩展出支持 64 位值的ILongOrdinalizer。配置数据驱动具体语言的行为来自 src/Humanizer/Locales 下的 YAML 文件如 es.yml 的ordinal.numeric段由源生成器读取并生成序数器注册代码参见 OrdinalizerProfileCatalogInput.cs 中对suffix、modulo-suffix、template、word-form-template、number-word-suffix等引擎的分发逻辑。这意味着新增或修改某语言的序数规则通常只需调整对应 YAML 配置而无需改动 C# 代码。常用边界与注意事项分数/非整数值不在序数化范围内OrdinalizeExtensions的 XML 注释明确说明序数化仅接受整数值调用方需先自行完成取整与转换OrdinalizeExtensions.cs。string 重载受int范围限制超过int.MaxValue会抛OverflowException需要大数请使用long重载。未实现ILongOrdinalizer的自定义序数器在处理超 int 范围的long时会抛NotSupportedException。未显式传culture时行为依赖当前线程文化CultureInfo.CurrentCulture在 Web 等多线程环境下应显式传参以保证结果确定。相关测试与文档索引单元测试tests/Humanizer.Tests/OrdinalizeTests.cs 覆盖 int/string/long 三种接收者、性别无关性、词形差异、各区域文化的规则一致性及负数/极值场景。核心实现src/Humanizer/OrdinalizeExtensions.cs接口与实现src/Humanizer/Localisation/Ordinalizers/IOrdinalizer.cs、src/Humanizer/Localisation/Ordinalizers/WordFormTemplateOrdinalizer.cs配置注册src/Humanizer/Configuration/OrdinalizerRegistry.cs、src/Humanizer/Configuration/Configurator.cs语言配置示例src/Humanizer/Locales/es.yml。综上Humanizer 的OrdinalizeExtensions以扩展方法 本地化注册表 YAML 驱动的三层架构为 .NET 开发者提供了从最简单的1.Ordinalize()到多语言、多性别、多词形的完整序数化能力是处理第几这类展示需求时的首选 API。赞分享开发工具【免费下载链接】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 序数化扩展OrdinalizeExtensions完全指南从 1st/2nd/3rd 到多语言序数输出Humanizer 序数化扩展OrdinalizeExtensions完全指南从 1st/2nd/3rd 到多语言序数输出 OrdinalizeExten开发工具Humanizer 序数化扩展OrdinalizeExtensions完全指南从 1st/2nd/3rd 到多语言、多性别的序数格式化Humanizer 序数化扩展OrdinalizeExtensions完全指南从 1st/2nd/3rd 到多语言、多性别的序数格式化 Ordinaliz开发工具Humanizer 的 OrdinalizeExtensions 完整指南将数字转换为序数词的扩展方法详解Humanizer 的 OrdinalizeExtensions 完整指南将数字转换为序数词的扩展方法详解 本篇技术指南以 Humanizer 项目 2.14开发工具上一篇【亲测免费】 GDScript Toolkit提升GDScript开发效率的利器下一篇如何快速配置开发环境终极自动化工具 Autoenv 完全指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考