ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Humanizer INumberToWordsConverter 接口深度解析:数字转单词、序数词与元组名的本地化实现

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点击查看免费下载导读INumberToWordsConverter是 Humanizer 本地化数字渲染体系的核心抽象接口负责将数字转换为基数词cardinal words、序数词ordinal words与命名元组named tuple如 single、double。所有ToWords()、ToOrdinalWords()、ToTuple()扩展方法最终都会解析到该接口的某个实现上。本文以版本 2.13.14 的 API 文档为骨架结合当前仓库的源码、注册机制与测试用例完整讲解接口的每个方法签名、参数语义、默认值与调用链并给出自定义本地化转换器的实现思路。关联文档Humanizer.Localisation.NumberToWords.INumberToWordsConverter.md位于website/versioned_docs/version-2.13.14/api/目录接口定位本地化数字渲染的统一契约在 Humanizer 中数字转单词的能力按语言locale隔离。INumberToWordsConverter定义于 src/Humanizer/Localisation/NumberToWords/INumberToWordsConverter.cs其 XML 注释言简意赅Converts numbers into locale-specific words, ordinals, and tuple names.它在整个 Humanizer 架构中扮演的角色可以从三个方面理解它是扩展方法的落地目标NumberToWordsExtensionsrc/Humanizer/NumberToWordsExtension.cs中所有ToWords、ToOrdinalWords、ToTuple、ToIndianWords扩展方法最终都通过Configurator.GetNumberToWordsConverter(culture)拿到一个INumberToWordsConverter实例并调用其方法它是注册表Registry的泛型参数NumberToWordsConverterRegistrysrc/Humanizer/Configuration/NumberToWordsConverterRegistry.cs继承LocaliserRegistryINumberToWordsConverter以语言代码为键维护各语言实现该注册表通过Configurator.NumberToWordsConverters属性对外暴露src/Humanizer/Configuration/Configurator.cs它是源码生成器Source Generator的目标契约Humanizer.SourceGenerators在编译期从Locales/*.yml生成各语言的转换器注册代码并调用NumberToWordsProfileCatalog.Resolve(profile, culture)解析具体实现见 src/Humanizer.SourceGenerators/Common/GenerationHelpers.cs。因此理解这个接口就等于理解了 Humanizer 数字本地化能力的插座——新语言接入、自定义覆盖、调用方扩展全部围绕它展开。方法全解五种签名逐一拆解1.Convert(long number)— 按默认语法性别输出基数词string Convert(long number);这是最基础的签名将数字转换为字符串使用该语言环境默认的语法性别default grammatical gender。参数number类型为System.Int64返回System.String。调用示例基于 tests/Humanizer.Tests/NumberToWordsTests.cs 的ToWordsLong测试数据即number.ToWords()的等价行为1L - one 111L - one hundred and eleven 1111111L - one million one hundred and eleven thousand one hundred and eleven注意接口与扩展方法之间的映射关系long.ToWords(culture, addAnd)实际调用的是Convert(number, addAnd)src/Humanizer/NumberToWordsExtension.cs而int.ToWords()会先升级为long再走同一路径src/Humanizer/NumberToWordsExtension.cs。Convert(long)这个无参重载则更多作为各实现类的基础抽象方法存在。2.Convert(long number, bool addAnd)— 控制是否插入连词string Convert(long number, bool addAnd);在复合数字compound numbers中许多语言会在最后一个数位组前插入连词典型如英语的andone hundred and eleven。该参数让调用方显式决定是否插入这一连词。参数说明参数类型语义numberlong要转换的数字addAndbool是否在复合数字中插入语言环境的连词如英语的 and这一点有测试直接印证tests/Humanizer.Tests/NumberToWordsTests.cs 中3501L.ToWords(addAnd: false)输出three thousand five hundred one省略了 and而默认addAnd: true时输出three thousand five hundred and one。3.Convert(long number, GrammaticalGender gender, bool addAnd true)— 指定语法性别string Convert(long number, Humanizer.GrammaticalGender gender, bool addAndtrue);这是文档中唯一带有默认值的重载addAnd默认为true。gender参数的类型为Humanizer.GrammaticalGender定义在 src/Humanizer/GrammaticalGender.cs枚举值为Masculine阳性、Feminine阴性、Neuter中性。语法性别对某些语言是硬需求。例如见 src/Humanizer/NumberToWordsExtension.cs 的文档注释// 俄语 1.ToWords(GrammaticalGender.Masculine) - один 1.ToWords(GrammaticalGender.Feminine) - одна // 希伯来语 1.ToWords(GrammaticalGender.Masculine) - אחד 1.ToWords(GrammaticalGender.Feminine) - אחת4.ConvertToOrdinal(int number)— 按默认性别输出序数词string ConvertToOrdinal(int number);将数字转换为序数词使用语言默认的语法性别。注意参数类型是intSystem.Int32与基数词接口的long不同。英文序数词行为由 tests/Humanizer.Tests/NumberToWordsTests.cs 的ToOrdinalWords测试完整覆盖0 - zeroth 1 - first 2 - second 3 - third 5 - fifth 8 - eighth 9 - ninth 12 - twelfth 20 - twentieth 21 - twenty-first 112 - hundred and twelfth 1021 - thousand and twenty-first跨语言行为由ToOrdinalWords_CanSpecifyCultureExplicitly测试验证tests/Humanizer.Tests/NumberToWordsTests.cs1021, en-US - thousand and twenty-first 21, ar - الحادي و العشرون 1112, ru - одна тысяча сто двенадцатый5.ConvertToOrdinal(int number, GrammaticalGender gender)— 按指定性别输出序数词string ConvertToOrdinal(int number, Humanizer.GrammaticalGender gender);在支持性别区分的语言中序数词也会随性别变化。例如巴西葡萄牙语的文档注释src/Humanizer/NumberToWordsExtension.cs1.ToOrdinalWords(GrammaticalGender.Masculine) - primeiro 1.ToOrdinalWords(GrammaticalGender.Feminine) - primeira6.ConvertToTuple(int number)— 生成命名元组string ConvertToTuple(int number);将整数转换为命名元组named tuple例如single、double等。该方法的调用入口是int.ToTuple()扩展方法src/Humanizer/NumberToWordsExtension.cs。英文行为由ToTuple测试覆盖tests/Humanizer.Tests/NumberToWordsTests.cs0 - 0-tuple 1 - single 2 - double 3 - triple 4 - quadruple 5 - quintuple 6 - sextuple 7 - septuple 8 - octuple 9 - nonuple 10 - decuple 100 - centuple 1000 - milluple注意0没有标准命名回退为0-tuple的数字拼接形式。文档未列出的扩展重载当前源码接口全景上述 2.13.14 API 文档仅收录了 6 个方法。但当前仓库源码中的接口定义src/Humanizer/Localisation/NumberToWords/INumberToWordsConverter.cs在此基础上扩展了WordForm词形维度实际包含 10 个方法。WordForm定义于 src/Humanizer/WordForm.cs枚举值为Normal正常形式、Abbreviation缩写形式、Eifeler卢森堡语的 Eifeler 规则形式。新增的 4 个重载为方法说明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)词形 性别 连词全量参数string ConvertToOrdinal(int number, WordForm wordForm)/ConvertToOrdinal(int number, GrammaticalGender gender, WordForm wordForm)序数词的词形扩展词形最典型的应用是西班牙语见 src/Humanizer/NumberToWordsExtension.cs 与 src/Humanizer/NumberToWordsExtension.cs 的示例21.ToWords(WordForm.Normal) - veintiuno // 如 Mi número favorito es el veintiuno 21.ToWords(WordForm.Abbreviation)- veintiún // 如 En total, conté veintiún coches 3.ToOrdinalWords(GrammaticalGender.Masculine, WordForm.Normal) - tercero 3.ToOrdinalWords(GrammaticalGender.Masculine, WordForm.Abbreviation) - tercer // 如 Vivo en el tercer piso值得注意的兼容性设计对于英语等不支持词形区分的语言WordForm参数会被忽略。测试ToOrdinalWords_WordFormIsIgnoredtests/Humanizer.Tests/NumberToWordsTests.cs与ToOrdinalWords_WordFormIsIgnoredWithSpecificCulturetests/Humanizer.Tests/NumberToWordsTests.cs明确验证了这一点覆盖 en-US、sv-SE、ko-KR 等语言。调用链与默认值语义从扩展方法到具体实现INumberToWordsConverter是链条的终点调用方通常不直接触碰它而是通过扩展方法。核心调用链如下调用方执行1234.ToWords()src/Humanizer/NumberToWordsExtension.cs 将int升级为long调用long重载src/Humanizer/NumberToWordsExtension.cs 调用Configurator.GetNumberToWordsConverter(culture).Convert(number, addAnd)src/Humanizer/Configuration/Configurator.cs 通过NumberToWordsConverters.ResolveForCulture(culture)解析出对应语言的INumberToWordsConverter实例最终执行具体的Convert实现并返回本地化字符串。Convert(long number, GrammaticalGender gender, bool addAnd true)的默认值addAnd true意味着在语言支持连词的场景下默认总是插入连词英语为 and。这一默认值在GenderlessNumberToWordsConverter与GenderedNumberToWordsConverter两个抽象基类中被一致继承。抽象基类两套默认实现的拆分逻辑接口之下Humanizer 通过两个抽象基类为具体语言实现提供脚手架两者都位于 src/Humanizer/Localisation/NumberToWords/ 目录GenderlessNumberToWordsConverter — 无性别语言src/Humanizer/Localisation/NumberToWords/GenderlessNumberToWordsConverter.cs 服务于数字渲染不依赖语法性别的语言。它只要求子类实现两个核心抽象方法public abstract string Convert(long number); public abstract string ConvertToOrdinal(int number);其余所有重载含addAnd、gender、wordForm各维度都由基类提供扇出fan-out默认实现——例如Convert(long, GrammaticalGender, bool)直接委托给Convert(long)ConvertToOrdinal(int, GrammaticalGender)直接委托给ConvertToOrdinal(int)。子类只需覆盖真正随语言变化的部分。GenderedNumberToWordsConverter — 有性别语言src/Humanizer/Localisation/NumberToWords/GenderedNumberToWordsConverter.cs 服务于俄语、希伯来语、葡萄牙语等区分语法性别的语言。其构造函数接受默认性别defaultGender GrammaticalGender.Masculine基类将所有无性别重载路由到带性别核心实现public string Convert(long number) Convert(number, defaultGender); // 使用默认性别 public abstract string Convert(long number, GrammaticalGender gender, bool addAnd true); public abstract string ConvertToOrdinal(int number, GrammaticalGender gender);子类只需实现这两个性别感知的抽象方法即可获得全部 10 个接口成员的完整行为。兜底实现DefaultNumberToWordsConvertersrc/Humanizer/Localisation/NumberToWords/DefaultNumberToWordsConverter.cs 是极端兜底方案当某语言环境没有专门的数字转单词渲染器时它继承GenderlessNumberToWordsConverter直接调用number.ToString(culture)输出文化感知的数字格式不做单词化。NumberToWordsConverterRegistry的默认解析目标即英语src/Humanizer/Configuration/NumberToWordsConverterRegistry.cs。语言注册与源码生成40 实现如何装配从 src/Humanizer/Localisation/NumberToWords/ 目录可见Humanizer 为不同语言族准备了大量组合式基类与具体转换器包括但不限于英语家族ConjunctionalScaleNumberToWordsConverter连词式、HyphenatedScaleNumberToWordsConverter连字符式如twenty-one印度数字体系IndianGroupingNumberToWordsConverter、IndianGroupingGenderedNumberToWordsConverterlakh/crore 分组并有ToIndianWords扩展方法按IndianScaleStyle选择NamedScales或CroreBased词表src/Humanizer/NumberToWordsExtension.cs东斯拉夫语族EastSlavicNumberToWordsConverter俄语、乌克兰语等区分性别东亚语族EastAsianGroupedNumberToWordsConverter以万/亿为单位分组其他形态LinkedVigesimalNumberToWordsConverter连接式二十进制用于丹麦语系、MacedonianNumberToWordsConverter、SouthSlavicCardinalNumberToWordsConverter、WestSlavicGenderedNumberToWordsConverter等。这些实现并非手工逐一注册而是由Humanizer.SourceGenerators在编译期从 src/Humanizer/Locales/*.yml共 100 个语言文件生成注册代码注册过程通过NumberToWordsProfileCatalog.Resolve(profile, culture)解析src/Humanizer.SourceGenerators/Common/GenerationHelpers.cs。这种YAML 语言数据 源码生成的架构使新增语言只需补充数据文件而无需手写样板注册逻辑。自定义转换器实现接口的完整步骤若你的应用需要为 Humanizer 未覆盖的语言提供数字转单词能力可按以下步骤接入实现接口新建类实现INumberToWordsConverter或继承GenderlessNumberToWordsConverter/GenderedNumberToWordsConverter以复用重载扇出逻辑至少实现基数词与序数词的核心方法public sealed class MyLanguageNumberToWordsConverter : GenderlessNumberToWordsConverter { public override string Convert(long number) { // 实现数字 - 基数词 的本地化逻辑 return /* localized cardinal words */; } public override string ConvertToOrdinal(int number) { // 实现数字 - 序数词 的本地化逻辑 return /* localized ordinal words */; } }注册到全局注册表通过Configurator.NumberToWordsConverters类型为LocaliserRegistryINumberToWordsConverter见 src/Humanizer/Configuration/Configurator.cs将实例绑定到语言代码Configurator.NumberToWordsConverters.Register(xx, new MyLanguageNumberToWordsConverter());指定文化调用之后即可通过ToWords(culture)、ToOrdinalWords(culture)、ToTuple(culture)使用自定义转换器扩展方法会自动通过ResolveForCulture命中你的注册src/Humanizer/Configuration/Configurator.cs。小结接口背后的设计要点职责单一INumberToWordsConverter只负责数字 → 本地化单词/序数/元组名这一件事语法性别、连词、词形三个正交维度通过重载组合表达默认值合理addAnd true使默认输出符合英语等语言的日常书写习惯需要无连词形式时显式传入false见 tests/Humanizer.Tests/NumberToWordsTests.cs渐进式实现成本抽象基类把 10 个接口成员的实现成本压缩到 2 个核心抽象方法无性别语言只需实现Convert(long)与ConvertToOrdinal(int)测试驱动验证en-US、ar、ru、hr、ta、sv-SE、ko-KR 等多种文化的输出均有 tests/Humanizer.Tests/NumberToWordsTests.cs 中的 Theory 数据兜底可作为新语言实现正确性的参照。从 API 文档中 6 个方法出发读者现在应该能够完整回答三个问题ToWords()/ToOrdinalWords()/ToTuple()最终调用谁、addAnd/gender/wordForm参数如何影响输出、以及如何为自定义语言实现并注册一个本地化数字转换器。赞分享开发工具【免费下载链接】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 数字转文字核心接口 INumberToWordsConverter 完全指南本地化基数词、序数词与元组名的统一抽象Humanizer 数字转文字核心接口 INumberToWordsConverter 完全指南本地化基数词、序数词与元组名的统一抽象 Humanizer 是开发工具Humanizer 的 INumberToWordsConverter深入解析数字转单词的多语言转换接口Humanizer 的 INumberToWordsConverter深入解析数字转单词的多语言转换接口 导读 INumberToWordsConverter开发工具Humanizer 数字转单词扩展深度指南NumberToWordsExtension 本地化基数词与序数词转换全解析Humanizer 数字转单词扩展深度指南NumberToWordsExtension 本地化基数词与序数词转换全解析 导读 Humanizer 的 Numb开发工具上一篇Wails v3 的 Vue 3 TypeScript Vite 前端模板开发环境配置与类型支持实战指南下一篇CANN ops-math ConcatV2 算子实战指南aclnn 接口调用与 NPU 双张量拼接实现解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表