C# Humanizer库使用方法 C#如何将日期、数字转换为易读字符串

来源:这里教程网 时间:2026-02-21 17:40:21 作者:

Humanizer 日期转中文描述:用
ToHumanize()
但要注意文化上下文

默认情况下

ToHumanize()
输出英文(如 “2 hours ago”),想输出中文必须显式指定
zh-CN
文化。不设 culture 会走当前线程默认,线上环境容易出错。

正确写法:
DateTime.Now.AddHours(-2).ToHumanize(new CultureInfo("zh-CN"))
→ “2 小时前”
若项目全局用中文,建议在启动时设置:
CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("zh-CN");
注意
ToHumanize()
对未来时间也生效,比如
DateTime.Now.AddMinutes(5)
返回 “5 分钟后”,无需额外判断方向
它不处理格式化精度,
TimeSpan.FromMinutes(1.8)
会被截断为 “1 分钟”,不会显示秒级

数字转中文读法:用
Ordinalize()
SpellOut()
区分场景

Ordinalize()
是“第几”的序数表达,
SpellOut()
是“几十几”的基数读法,二者语义不同,混用会导致逻辑错误。

序数(带“第”):
21.Ordinalize(new CultureInfo("zh-CN"))
→ “第二十一”
基数(纯读数):
123.SpellOut(new CultureInfo("zh-CN"))
→ “一百二十三”
小数支持有限:
3.14.SpellOut()
报错,需先转整数或手动拆解
大数字(如百万以上)在中文里默认不自动加“万/亿”,
10000.SpellOut()
返回 “一万个”,不是 “一万”——这是 Humanizer 的设计限制,不是 bug

安装与基础引用:NuGet 包名是
Humanizer.Core.zh-CN
,不是
Humanizer

只装

Humanizer
主包,调用中文方法会静默失败或回退英文。中文支持是按语言拆分的子包,必须单独引用。

NuGet 命令:
dotnet add package Humanizer.Core.zh-CN
同时需确保主包版本匹配,例如
Humanizer.Core.zh-CN 4.0.0
要求
Humanizer 4.0.0
(非 3.x)
ASP.NET Core 项目中,若用
IStringLocalizer
混用 Humanizer,注意资源文件路径和 culture 传递链路,否则
zh-CN
可能被覆盖

常见报错:
System.Globalization.CultureNotFoundException
或空字符串返回

这通常不是代码写错,而是 culture 名称拼写错误或未加载对应资源。Humanizer 对 culture 名称大小写敏感,且不接受别名(如

zh
不行,必须
zh-CN
)。

检查是否误写成
zh-china
ZH-CN
zh_Hans
—— 全部无效
运行时验证 culture 是否可用:
CultureInfo.GetCultures(CultureTypes.AllCultures).Any(c => c.Name == "zh-CN")
某些 Linux 容器缺少中文 locale,需在 Dockerfile 中添加:
RUN apt-get update && apt-get install -y locales && locale-gen zh_CN.UTF-8
如果返回空字符串而非抛异常,大概率是 culture 加载失败后 fallback 到空实现,务必加日志输出实际传入的
CultureInfo
实例
Humanizer 的中文能力依赖 culture 资源完整性,不是所有数字/日期组合都覆盖到位,比如农历、节气、相对时间跨天(“昨天下午三点”)目前不支持,得自己补逻辑。

相关推荐