Humanizer OrdinalizeExtensions 序数化扩展:将数字转换为 1st、2nd、3rd 等序数形式的完整指南
开发工具【免费下载链接】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),仅供参考

相关新闻

Python常用函数速查手册:用TaoToken统一Key打通AI辅助编码工作流

Python常用函数速查手册:用TaoToken统一Key打通AI辅助编码工作流

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

2026/9/30 9:26:43 阅读更多 →
AI写代码、不画帧:Opus 5.5+Python+FFmpeg生成30秒粒子动画全解析

AI写代码、不画帧:Opus 5.5+Python+FFmpeg生成30秒粒子动画全解析

事情是这样的。我想让 Opus 5.5 帮我做一条 30 秒的视频,但最后成品里它一帧都没「生成」——所有画面,没有一帧是 AI 直接画出来的。你可能觉得这很怪,但恰恰是这次尝试,让我彻底理解了 AI 在视频创作里真正该站的位置。它不是替…

2026/9/30 9:25:58 阅读更多 →
基于Dify的AI对话复盘系统:让大模型应用具备事后反思能力

基于Dify的AI对话复盘系统:让大模型应用具备事后反思能力

这几天我在折腾一个叫hindsight的项目,简单说,就是给大模型应用配上一套“事后复盘”的能力。过去我们做聊天机器人、做知识库问答,模型答完就完了,答得好不好、有没有漏掉关键信息、用户是怎么走到死胡同的,这些东西全…

2026/9/29 9:14:56 阅读更多 →

最新新闻

数据中台服务监控实战:从指标体系到告警治理

数据中台服务监控实战:从指标体系到告警治理

1. 数据服务监控的核心定位与整体思路 1.1 为什么监控是数据中台落地成败的关键 聊到数据中台,很多团队的第一反应是数据模型怎么设计、指标口径怎么统一、数据迁移怎么把异构系统的数据搬过来。这些确实是中台建设的地基和承重墙,但我做了这么多年数据…

2026/9/30 12:37:51 阅读更多 →
Android备忘录实战:Room、RecyclerView与增删改查

Android备忘录实战:Room、RecyclerView与增删改查

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

2026/9/30 12:37:51 阅读更多 →
Paperclip胶水协议:用JSON Schema整合OpenClaw、Claude与React的AI工具链

Paperclip胶水协议:用JSON Schema整合OpenClaw、Claude与React的AI工具链

1. 项目概述:Paperclip 不是回形针,而是一个被严重误读的 AI 工具链命名陷阱“Paperclip”这个词在中文技术圈里最近频繁出现,但几乎没人说清楚它到底指什么。你搜“paperclip node.js”,结果跳出来一堆 OpenClaw、Claude、React …

2026/9/30 12:37:51 阅读更多 →
Python运算符完全指南:算术、比较、逻辑与优先级详解

Python运算符完全指南:算术、比较、逻辑与优先级详解

1. 为什么单独拿一章学运算符 1.1 运算符不只是算数 很多初学Python的朋友,看到“运算符”这一章时第一反应是:这不就是小学的加减乘除吗?当年我也是这么想的,直到我在实际写代码时被 // 、 % 和 ** 折磨得怀疑人生&#x…

2026/9/30 12:37:51 阅读更多 →
GTK界面开发实战:从控件树到系统监控工具的设计全解析

GTK界面开发实战:从控件树到系统监控工具的设计全解析

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

2026/9/30 12:37:51 阅读更多 →
PHP中Repository到底算不算设计模式?一文厘清概念与实战

PHP中Repository到底算不算设计模式?一文厘清概念与实战

1. 为什么“Repository是设计模式”这句话让人半信半疑第一次听到“PHP的Repository 设计模式?”这个问题时,我大概正坐在某次技术分享的最后一排。台上的讲师放出一张类图,说“这里我们用Repository模式解耦数据访问”,底下有个…

2026/9/30 12:36:49 阅读更多 →

日新闻

Base64 图片头部特征识别:从文件头到格式判断的完整指南

Base64 图片头部特征识别:从文件头到格式判断的完整指南

1. 项目概述:为什么说看懂 base64 图片头部是基本功这几年跟 base64 打交道的机会越来越多,后端接口返回图片、前端渲染验证码、小程序里存小图、还有一些老系统导出报表,动不动就给你一段长到怀疑人生的 base64 字符串。很多人拿到字符串就直…

2026/9/30 0:00:35 阅读更多 →
Java公交站牌广告管理系统:JSP+Servlet+MySQL实战落地指南

Java公交站牌广告管理系统:JSP+Servlet+MySQL实战落地指南

简介:本资源是一份面向Java初学者与课程设计学生的公交站牌广告灯箱管理系统毕业设计文档,聚焦城市公共广告资源信息化管理痛点,提供从需求分析到技术实现的完整方案。文档采用标准学术论文结构,含摘要、英文摘要、目录及五章正文…

2026/9/30 0:00:35 阅读更多 →
用 Redis Lua 构建大模型 API 多租户原子配额治理体系

用 Redis Lua 构建大模型 API 多租户原子配额治理体系

我去年年底接了一个内部 AI 平台的治理需求,背景很直接:公司把 DeepSeek、MiniMax 这类大模型 API 统一封装成内部网关,开放给几个业务团队用。结果第一个月账单出来,额度直接超了 4 倍。仔细查日志,发现原因并不复杂—…

2026/9/30 0:00:35 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/29 8:16:59 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/29 16:41:41 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/29 8:24:48 阅读更多 →

月新闻

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

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

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

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

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

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

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

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

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

2026/9/29 3:55:56 阅读更多 →