Humanizr/Humanizer · 上手攻略

  • 仓库:Humanizr/Humanizer
  • 链接:https://github.com/Humanizr/Humanizer
  • 分类:.net-library · utility
  • 作者:Tom
  • 更新:2026-08-13

是什么

Humanizer 是一个久经沙场的 .NET 库,专门把程序里的各种值(字符串、枚举、日期、时间、时间跨度、数字、数量、字节大小、集合)转成人类可读的文本。它的 API 极其简洁——所有转换都以链式扩展方法形式附加在原生类型上,一行调用即完成转换。

这个库的最大特点不是"能做什么",而是"做得有多好":支持全球数十种文化(culture),转换结果随文化不同而变化,例如同样是 TimeSpan.FromMinutes(2).Humanize(),英语输出 "2 minutes",德语输出 "2 Minuten",俄语输出 "2 минуты"——无需额外代码,只要换个 CultureInfo。

NuGet 包名即 Humanizer,持续活跃维护,最新稳定版 3.x,文档站点 humanizr.net


解决什么问题

在 .NET 应用里,数据库存的往往不是人类想看的东西:TimeSpan.FromDays(14) 存的是 14,但界面上显示"14 天"还是"两周"更友好?Gender.M 存的是枚举值,但通知文案里要写"他"还是"她"?1000000000 数字要显示成"1 Billion"还是中文的"10 亿"?这些问题每个都小,但每次手写格式化代码就是重复劳动。

Humanizer 把这些全部接管——一行代码搞定所有常见格式化需求,支持国际化,不用再维护一套自己的格式化工具类。


快速安装

# NuGet 包管理器
dotnet add package Humanizer

# 或 Package Manager Console
Install-Package Humanizer

# 或 Paket
paket add Humanizer

⚠️ 选择版本时需与 .NET 目标框架匹配:v3.x 支持 .NET 6+ / .NET Framework 4.6.1+ / .NET Standard 2.0+ / .NET Core 2.0+。v4.x(预览)引入了新的 SI/IEC 字节格式 API 和新的复数形式 API,与 v3 行为有差异。生产项目建议锁定 v3.x,升级前阅读 humanizr.net/docs/upgrading

安装后直接 using:

using Humanizer;

核心用法

时间和时间跨度

using System.Globalization;

// 基本用法
TimeSpan.FromMinutes(2).Humanize();
// → "2 minutes"

TimeSpan.FromMilliseconds(1500).Humanize();
// → "1.5 seconds"

// 带精度的分数秒(v3 新 API)
TimeSpan.FromMilliseconds(1500).HumanizeWithFractionalSeconds(
    precision: 1,
    maxFractionalDigits: 3,
    roundingMode: MidpointRounding.ToEven,
    culture: CultureInfo.GetCultureInfo("en-US")
);
// → "1.5 seconds"

// 特定文化(德语与格)
var german = CultureInfo.GetCultureInfo("de-DE");
TimeSpan.FromDays(7).HumanizeWithCase(
    GrammaticalCase.Dative,
    culture: german
);
// → "in einer Woche"(一周后)

// 日期
DateTime.UtcNow.AddHours(-3).Humanize();
// → "3 hours ago"

数字和数量

// 英文
1234.Humanize();
// → "1,234"

1_000_000_000.ToWords();
// → "one billion"

// 印度计数制(Crore/Lakh)
1_000_000_000L.ToIndianWords(IndianScaleStyle.CroreBased);
// → "one hundred crore"

// 中文大写(需配合 Culture)
// ⚠️ Humanizer 本身不内置中文汉字转换,结合 .NET 的 CultureInfo("zh-CN") 使用

字节大小(v4 预览新 API)

using Humanizer;

// v4 预览引入:显式 SI / IEC 区分
var size = ByteSize.FromBytes(1_000_000);

size.Format(ByteSizeUnitSystem.DecimalSi);
// → "1 MB"  (1000-based, SI 标准)

size.Format(ByteSizeUnitSystem.BinaryIec);
// → "976.56 KiB"  (1024-based, IEC 标准)

// ⚠️ Legacy API(v3)使用固定换算规则,不区分 SI/IEC
ByteSize.FromKibibytes(1).ToString();
// → "1 kB"  ⚠️ 实际是 1024 字节,但 Legacy 用 kB 标签

⚠️ v4 预览 API 不稳定:SI/IEC 显式格式化和 TryPluralize/TrySingularize 新 API 仅在 v4 预览版中可用。生产代码建议在 v3 上等稳定版,或明确锁定预览版并在升级时重新测试。

枚举和字符串

// 枚举值转可读字符串(驼峰命名自动拆词)
enum PaymentTerm { Net30, Net60, CashOnDelivery }
PaymentTerm.Net30.Humanize();
// → "Net 30"

"SpecialFileFormat".Humanize();
// → "Special file format"

// 复数形式
"ox".Pluralize();
// → "oxen"

"fish".Pluralize();
// → "fish"(不变复数)

// 自定义复数规则(v4 预览)
var files = new PluralizationForms(
    singular: "plik",
    other: "pliku",
    few: "pliki",
    many: "plików"
);
files.TryPluralize(5m, CultureInfo.GetCultureInfo("pl"), out var noun);
// → "plików"

日期处理

// 相对日期("3 hours ago" / "in 2 weeks")
DateTime.Now.AddDays(-1).Humanize();
// → "yesterday"

DateTime.Now.AddMonths(2).Humanize();
// → "in 2 months"

// 具体日期格式化
new DateTime(2024, 12, 25).Humanize();
// → "Monday, 25 December 2024"

典型适用场景

  • 日志和监控面板:把毫秒级时间戳转成 "3.2 seconds""2 hours ago",比原始数字友好一百倍
  • SaaS 通知文案:订单完成 "Your order will arrive in 3 days" 而非 "arrives in 259200 seconds"
  • 国际化产品:同一套业务代码换 CultureInfo 就切换语言,无需重写格式化逻辑
  • 电商和金融:金额大写、数量复数自动处理(如 "1 item" vs "2 items")
  • 数据导出报告:把数据库枚举值在 Excel/PDF 报告里显示成可读标签
  • CLI 工具输出:给终端用户看的格式化输出,比直接 ToString() 专业得多

坑与注意

问题 原因/细节 解决方案
v4 预览 API 不稳定 新增的 TryPluralize/TrySingularize 和 SI/IEC 字节 API 仅预览版可用 生产项目锁定 v3.x;必须用 v4 时隔离在单独适配层
Legacy 字节 API 不区分 SI/IEC ByteSize.FromKibibytes(1).ToString() 输出 "1 kB"(标签误导,实际是 1024 字节) v4 预览用 ByteSizeUnitSystem.BinaryIec 显式指定;v3 只能靠文档约定
德语与格等语法格支持不完整 HumanizeWithCase 在部分文化上会抛 NotSupportedException,而非回退到英语 调用前查阅 humanizr.net/docs/scenarios/inflection-and-quantities 确认支持列表
中文数字转换不内置 ToWords() 无中文选项 结合 .NET CultureInfo("zh-CN") 混合使用,或自行封装中文格式化
不可作为序列化格式 Humanizer 输出是展示用,不是稳定格式 ⚠️ 不要将 Humanizer 输出持久化后再解析回去——文化/措辞/格式随时可能变化
枚举 Humanize 依赖命名约定 "Net30" 拆词依赖驼峰命名法,遇到非标准命名可能输出不理想 配合 [Description] 属性或自定义 EnumHumanize 扩展

与同类对比

平台 文化支持 特点 缺点
Humanizer .NET / .NET Framework 40+ 种 culture 扩展方法最优雅、覆盖最广(时间/数字/枚举/字节/复数) 非 .NET 平台不可用
moment.js JavaScript 国际化 时间处理权威 仅时间,数字/枚举不支持;已停止活跃维护
chrono-node JavaScript 有限 自然语言解析("3 days ago" → Date) 无格式化,无多文化
arrow Python 有限 时间处理 + 人类可读输出 仅时间,无数字/枚举
prettytable Python 有限 表格格式化 非同类功能

Humanizer 在 .NET 生态里没有真正同类竞品——它是唯一同时覆盖时间、数字、枚举、字节、复数且文化感知完整的格式化库。如果你的项目是 .NET,这是必装的基础设施包。


一句话推荐结论

Humanizer 是 .NET 开发者花最少力气让应用界面"更像人话"的不二之选——一个 NuGet 包、一行 using Humanizer,所有时间/数字/枚举/字节的格式化全部告别手写,尤其是做国际化产品时,CultureInfo 一切换就搞定全球语言,比自己维护格式化工具类省心十倍。


原始仓库:https://github.com/Humanizr/Humanizer · MIT License