首页/新闻资讯/正文详情

Humanizer 数字本地化核心接口 INumberToWordsConverter 完全解析:从方法签名到多语言实现

发布时间:2026/9/26 2:05:12 来源:云帆数科 栏目:资讯中心
Humanizer 数字本地化核心接口 INumberToWordsConverter 完全解析:从方法签名到多语言实现
开发工具【免费下载链接】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.Localisation.NumberToWords命名空间承载着 Humanizer 中“把数字变成当地语言单词”这一核心能力的抽象层。本文将以该命名空间唯一公开接口INumberToWordsConverter为主线完整梳理其方法签名、参数语义、扩展方法调用链、注册表配置机制并结合仓库内 40 个具体转换器实现与测试用例说明如何将该能力本地化到任意语言。读完本文你将能够理解ToWords/ToOrdinalWords/ToTuple等扩展方法背后的完整执行路径并掌握接入自定义语言转换器的全部接口契约。命名空间概览面向数字本地化的唯一公开接口在 version-2.11.10 的 API 文档中该命名空间下仅列出一个公开接口接口说明INumberToWordsConverter需要实现以本地化ToWords和ToOrdinalWords方法的接口这意味着Humanizer 将“数字 → 单词”的规则完全抽象为单一契约所有语言的转换器英文、中文、俄语、印度语、希伯来语等都通过实现该接口接入系统而面向用户的扩展方法如123.ToWords()只与该接口打交道不感知具体语言实现。接口的完整定义位于 src/Humanizer/Localisation/NumberToWords/INumberToWordsConverter.cs其 XML 注释概括了职责“将数字转换为区域相关的单词、序数词与元组名称”Converts numbers into locale-specific words, ordinals, and tuple names。接口方法全景基数词、序数词与元组转换2.11.10 版本的接口文档Humanizer.Localisation.NumberToWords.INumberToWordsConverter.md定义了 5 个方法而当前仓库源码中的接口已扩展为 10 个重载覆盖了基数词、序数词和元组三类转换能力。以下以当前源码为准并标注与旧版文档的对应关系。基数词转换Convert(long) 系列string Convert(long number);说明使用区域默认的语法性别grammatical gender将数字转换为字符串。参数numberSystem.Int64。返回System.String本地化的基数词。string Convert(long number, bool addAnd);说明使用区域默认语法性别并决定是否在复合数字中插入区域特定的连接词conjunction。参数addAndSystem.Boolean指定是否添加 And。string Convert(long number, GrammaticalGender gender, bool addAnd true);说明使用指定的语法性别进行转换addAnd默认值为true。参数genderGrammaticalGender在区域区分性别形式时使用。当前源码在此基础上新增了三个重载用于组合WordForm词形与上述选项string Convert(long number, WordForm wordForm); string Convert(long number, bool addAnd, WordForm wordForm); string Convert(long number, WordForm wordForm, GrammaticalGender gender, bool addAnd true);这些重载解决的是同一语言内“同一数字在不同句法位置存在不同拼写”的问题例如西班牙语中21在句尾写veintiuno在名词前修饰时写veintiún详见下文WordForm一节。序数词转换ConvertToOrdinal(int) 系列string ConvertToOrdinal(int number);说明使用区域默认语法性别将数字转换为序数词字符串。注意参数类型是System.Int32与基数词的long不同。string ConvertToOrdinal(int number, GrammaticalGender gender);说明使用指定的语法性别转换序数词。当前源码又补充了带WordForm的两个重载string ConvertToOrdinal(int number, WordForm wordForm); string ConvertToOrdinal(int number, GrammaticalGender gender, WordForm wordForm);序数词转换的价值在于输出如first、primero西语“第一”这类词形与Ordinalize输出1st这类后缀式序数化是两条不同的路径。元组名称转换ConvertToTuple(int)string ConvertToTuple(int number);说明将整数转换为区域特定的命名元组如英文的single、double当区域未定义对应名称时返回数字回退形式。这是1.ToTuple()扩展方法的底层实现入口。关键参数类型语法性别与词形要正确使用接口需要理解两个参数枚举GrammaticalGendersrc/Humanizer/GrammaticalGender.cs取值Masculine阳性、Feminine阴性、Neuter中性。俄语、希伯来语、葡萄牙语等语言中数字会随性别变形例如俄语1的阳性为один、阴性为одна巴西葡萄牙语1.ToOrdinalWords(GrammaticalGender.Masculine)输出primeiro阴性输出primeira。WordFormsrc/Humanizer/WordForm.cs取值Normal正常词形、Abbreviation缩略词形、Eifeler卢森堡语 Eifeler 规则词形依据后随辅音/元音决定是否省音。西班牙语是典型场景21.ToWords(WordForm.Normal)→veintiuno而21.ToWords(WordForm.Abbreviation)→veintiún序数词同样适用如3.ToOrdinalWords(WordForm.Normal)→tercero3.ToOrdinalWords(WordForm.Abbreviation)→tercer。扩展方法调用链从 ToWords 到接口用户日常使用的并不是接口方法而是 src/Humanizer/NumberToWordsExtension.cs 中的一组扩展方法。它们的共同特征是全部委托给Configurator.GetNumberToWordsConverter(culture)解析出的转换器实例。典型调用链如下public static string ToWords(this long number, CultureInfo? culture null, bool addAnd true) Configurator.GetNumberToWordsConverter(culture).Convert(number, addAnd);即123.ToWords()→Configurator.GetNumberToWordsConverter(null)→INumberToWordsConverter.Convert(123, true)。其他重载依此类推ToOrdinalWords(this int, ...)→ConvertToOrdinal(...)其中1.ToOrdinalWords()还带有特殊处理对丹麦语første、印尼语/马来语pertama、斯洛伐克语按性别返回prvý/prvá/prvé、祖鲁语okokuqala等文化直接返回原生“第一”词见扩展方法内部的TryGetNativeFirstOrdinalWordToTuple(this int, CultureInfo?)→ConvertToTuple(number)ToIndianWords(this long, IndianScaleStyle)则绕开当前文化配置强制解析en-IN转换器并按NamedScales印度命名刻度或CroreBased基于 crore 的口语表达如lakh crore、shankh两套刻度表转换。culture参数为null时使用当前线程文化显式传入CultureInfo即可实现跨文化转换这正是本地化测试的基础。注册表与配置转换器如何被解析接口实例由 src/Humanizer/Configuration/NumberToWordsConverterRegistry.cs 管理class NumberToWordsConverterRegistry : LocaliserRegistryINumberToWordsConverter { public NumberToWordsConverterRegistry() : base(_ NumberToWordsProfileCatalog.Resolve(en, CultureInfo.InvariantCulture)) NumberToWordsConverterRegistryRegistrations.Register(this); }两点值得注意默认回退到英文当某个文化没有注册专用转换器时ResolveForCulture会落到基类默认工厂即解析en不区分区域性的转换器保证任何文化下ToWords都不会抛异常注册表由源生成器填充NumberToWordsConverterRegistryRegistrations与NumberToWordsProfileCatalog均来自 src/Humanizer.SourceGenerators 根据 Locales 目录下的 YAML 数据 生成的代码因此新增语言只需提供 YAML 数据与转换器实现即可自动纳入注册。对外暴露的入口在 src/Humanizer/Configuration/Configurator.cspublic static LocaliserRegistryINumberToWordsConverter NumberToWordsConverters { get; } new NumberToWordsConverterRegistry();内部通过GetNumberToWordsConverter(CultureInfo?)完成按文化的解析。LocaliserRegistry的语义是优先查找完全匹配的CultureInfo匹配失败时逐级向上回退如zh-CN→zh→ 默认英文。默认回退实现与 40 个语言转换器当区域确实没有专用转换器时src/Humanizer/Localisation/NumberToWords/DefaultNumberToWordsConverter.cs 承担兜底职责它直接调用number.ToString(culture)即输出文化感知的数字格式化字符串而非单词——例如123.ToString(fr-FR)得到123。这是一个刻意保持最小化的实现正如其注释所述“仅在区域未提供专用数字转单词渲染器时使用”。在 src/Humanizer/Localisation/NumberToWords 目录下实际存在约 40 个具体转换器实现从文件名即可窥见多语言形态的工程分治语言专属MacedonianNumberToWordsConverter、IndianGroupingNumberToWordsConverter含IndianGroupingGenderedNumberToWordsConverter体现印度 3-2-2 分组法词形变化GenderedNumberToWordsConverter性别化基类、GenderlessNumberToWordsConverter无性别基类、EastSlavicNumberToWordsConverter东斯拉夫语族、WestSlavicGenderedNumberToWordsConverter、SouthSlavicCardinalNumberToWordsConverter结构策略TriadScaleNumberToWordsConverter三位一组、JoinedScaleNumberToWordsConverter、ConjunctionalScaleNumberToWordsConverter、ConjoinedGenderedScaleNumberToWordsConverter支持and连接词且区分性别的复合刻度、LinkedVigesimalNumberToWordsConverter二十进制序数策略HyphenatedOrdinalNumberToWordsConverter连字符序数、StemmedScaleNumberToWordsConverter词干变化、TerminalOrdinalScaleNumberToWordsConverter、LongScaleStemOrdinalNumberToWordsConverter等。可以推断这些类构成了一个“基类抽取共性 子类定制差异”的继承体系例如GenderlessNumberToWordsConverter提供Convert(long, GrammaticalGender, bool)的默认转发实现性别化语言的子类再覆盖性别分支。这种设计让每种语言只需实现自己独特的语法片段而将三位分组、刻度表、连接词等通用逻辑收敛到各抽象基类中。测试与契约验证仓库测试从多个角度锁定该接口的行为tests/Humanizer.Tests/Localisation/LocaleTheoryMatrixCompletenessTests.cs 断言每个已注册区域都至少有一个INumberToWordsConverter可用回退到英文也算满足防止语言矩阵出现“漏注册”tests/Humanizer.Tests/Localisation/NumberWordPhraseTests.cs 直接调用Configurator.NumberToWordsConverters.ResolveForCulture(...)并按区域断言输出tests/Humanizer.Tests/ApiApprover/PublicApiApprovalTest.Approve_Public_Api.*.verified.txt 通过 API 快照确认INumberToWordsConverter的公开签名、Configurator.NumberToWordsConverters属性以及ToTuple/ToIndianWords等扩展方法在各目标框架.NET 8、.NET 10/11、.NET Framework 4.8下保持一致tests/Humanizer.Tests/Localisation/ur/UrduOrdinalTests.cs 专门验证乌尔都语经由该接口路径输出的带性别序数词一致性。这些测试共同保证只要实现接口并注册ToWords/ToOrdinalWords/ToTuple就能被所有上层调用方透明使用。小结Humanizer.Localisation.NumberToWords是 Humanizer 本地化能力的枢纽之一INumberToWordsConverter以 10 个重载定义了基数词、序数词、元组三类转换契约NumberToWordsExtension将契约包装为对开发者友好的扩展方法NumberToWordsConverterRegistry与Configurator.NumberToWordsConverters提供按文化解析与英文兜底约 40 个具体转换器则承载各语言的语法细节。若需为自定义语言接入数字转单词能力只需实现该接口并通过注册机制登记即可复用整套扩展方法与测试体系。赞分享开发工具【免费下载链接】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 序数词本地化解析从 IOrdinalizer 接口到多语言 Ordinalize 实现Humanizer 序数词本地化解析从 IOrdinalizer 接口到多语言 Ordinalize 实现 本篇技术指南以 Humanizer 仓库中 Hum开发工具Humanizer 数字转文字核心接口 INumberToWordsConverter 完全指南本地化基数词、序数词与元组名的统一抽象Humanizer 数字转文字核心接口 INumberToWordsConverter 完全指南本地化基数词、序数词与元组名的统一抽象 Humanizer 是开发工具Humanizer 的 INumberToWordsConverter深入解析数字转单词的多语言转换接口Humanizer 的 INumberToWordsConverter深入解析数字转单词的多语言转换接口 导读 INumberToWordsConverter开发工具上一篇Chinese-BERT-wwm 项目常见问题解决方案下一篇【免费下载】 Chinese-BERT-wwm 安装和配置指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

Python解析中心极限定理
Python解析中心极限定理

中心极限定理是统计学和数据分析中非常重要的概念,帮助理解在重复抽样时,样本平均数的分布性质。在数据分析领域,许多实际应用依赖于中心极限定理的结果,尤其是在进行假设检验、数据推断等分析时。理解中心极限定理,可以为构建和解释复杂模型提供理论基础,也是理解统计推… · 2026/9/26 2:05:12

Python实现控制图分析
Python实现控制图分析

控制图在统计过程控制(SPC)中是常用的工具,用于监控制造或其他流程的稳定性。它通过图表的形式展示数据的波动范围,以此判断流程是否处于控制之中。控制图的核心是识别特殊原因的变异和常见原因的变异,从而帮助操作人员做出相应的调整。 控制图分为多种类型,其中常见的包… · 2026/9/26 2:05:06

Python进行聚类分析
Python进行聚类分析

在现代数据分析中,聚类分析作为一种无监督学习方法,已广泛应用于多个领域。它的核心任务是将数据集中的对象根据其内在的相似性进行划分,使同一组中的数据对象具有较高的相似度,而不同组之间的差异性较大。聚类算法通过多种方式来实现这一目的,从简单快速的划分方法到复杂… · 2026/9/26 2:05:06

前后端分离项目SM4加密传输数据实战指南
前后端分离项目SM4加密传输数据实战指南

写这篇东西的起因特别直白:我接了一个前后端分离的老项目,登录和提交订单的接口全部明文传输。前端把用户手机号、身份证号当查询参数拼在URL里,后端日志里能直接看到完整数据。老板的原话是“来波猛的”,意思就是别再补丁式修修补… · 2026/9/26 2:35:58

软著补正AIGC检出率高怎么办?处理流程与证明材料整理指南
软著补正AIGC检出率高怎么办?处理流程与证明材料整理指南

收到“文档鉴别材料AIGC检出率高”之后,我的处理流程和证明材料整理经验先说一下背景。我上周刚帮一个客户处理完软著补正,补正意见写得很直接:“经审查,该申请文档鉴别材料AIGC检测结果异常,检出率较高,请… · 2026/9/26 2:35:58

Windows触摸键盘深度解析:TabTip进程、配置与故障排查实战
Windows触摸键盘深度解析:TabTip进程、配置与故障排查实战

1. 先搞清楚:触摸键盘到底是个什么组件1.1 触摸键盘解决的核心问题我第一次认真研究触摸键盘(Touch Keyboard),不是出于好奇,而是被逼的。当时公司配了一批二合一设备,Windows平板模式下没有物理键盘&#… · 2026/9/26 2:35:58

Java+MySQL图书管理系统:验证工程闭环能力的最小完整体
Java+MySQL图书管理系统:验证工程闭环能力的最小完整体

简介:这是一套基于Java与MySQL开发的完整图书管理系统实战项目,面向Java初学者及课程设计学生,解决图书馆业务场景下的用户权限管理、图书进销存与借阅查询等核心需求。资源包共270个文件,含46个Java源码、200个编译后Class文件、… · 2026/9/26 2:35:58

百度文心4.5海外爆火背后:从飞桨开源到TaoToken统一API接入的完整教程
百度文心4.5海外爆火背后:从飞桨开源到TaoToken统一API接入的完整教程

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

Linux Socket编程预备课:搞懂内核协议栈与TCP状态机制
Linux Socket编程预备课:搞懂内核协议栈与TCP状态机制

很多人学Linux下的socket编程,第一反应都是去查bind()、listen()、accept()的函数签名,照着网上示例敲一遍,发现能跑通就觉得自己会了。结果换了个业务场景——服务器要压并发、客户端要处理半包、连接莫名其妙被重置——立刻抓瞎。我在这个行… · 2026/9/26 2:35:52

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21

OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置

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

向下兼容与向上兼容:接口设计中的兼容性策略与工程实践
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践

一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码