多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Hugo 模板函数 `lang.FormatNumber` 完全指南:按语言与地区本地化数字格式

Hugo 模板函数 `lang.FormatNumber` 完全指南:按语言与地区本地化数字格式 Hugo 模板函数lang.FormatNumber完全指南按语言与地区本地化数字格式【免费下载链接】hugoThe world’s fastest framework for building websites.项目地址: https://gitcode.com/gh_mirrors/hu/hugo本指南围绕 Hugo 官方文档 lang.FormatNumber 展开深入讲解这一模板函数如何在多语言站点中按当前语言与地区对数字进行本地化格式化从函数签名、精度规则到 locale 的解析机制、底层实现与测试验证。读完本文你将能在 Hugo 模板中准确输出符合目标语言习惯的数字如德语/挪威语的512,50与英语的512.50并理解其背后的语言回退逻辑从而正确配置多语言站点的数字显示。函数签名与基本用法lang.FormatNumber属于 Hugo 的lang模板函数命名空间其作用是以当前语言和地区locale的规则将数字格式化为指定精度的字符串。官方文档给出的签名与返回类型如下签名lang.FormatNumber PRECISION NUMBER返回类型string两个参数的含义参数类型说明PRECISIONint小数点后保留的位数NUMBERfloat64可接受可转换为数字的任意值要格式化的数字基本用法支持直接调用与管道两种形式{{ lang.FormatNumber 2 512.5032 }} → 512.50 {{ 512.5032 | lang.FormatNumber 2 }} → 512.50从官方文档与源码中的示例映射看该函数在默认英语环境下对512.5032保留 2 位小数输出为512.50。对应的方法注册位于 tpl/lang/init.go。精度规则与参数校验lang.FormatNumber在 tpl/lang/lang.go 中的实现非常简洁核心逻辑委托给底层翻译器func (ns *Namespace) FormatNumber(precision, number any) (string, error) { p, n, err : ns.castPrecisionNumber(precision, number) if err ! nil { return , err } return ns.translator.FormatNumber(n, p), nil }真正值得关注的是参数预处理函数castPrecisionNumbertpl/lang/lang.go它定义了三条关键行为精度通过cast.ToIntE转换传入的精度可以是字符串等可转换类型最终转为int精度上限为 20源码中有明确的 sanity check当p 20时返回错误invalid precision避免无意义的超高精度格式化数字通过cast.ToFloat64E转换支持整数、浮点数乃至字符串形式的数字输入。因此以下写法都是合法的{{ lang.FormatNumber 2 1234.5678 }} → 取决于语言环境如 1,234.57 {{ lang.FormatNumber 0 3.6 }} → 4四舍五入到整数需要注意的是四舍五入遵循5 及以上进位的规则同属lang命名空间的FormatNumberCustom在 tpl/lang/lang.go 注释中明确说明了这一点因此1.5在精度 0 下会变为2而1.4会变为1。locale 决定一切语言环境的解析机制lang.FormatNumber的输出格式小数点是.还是,、千位分隔符样式、负号位置等完全由当前语言的 locale决定。Hugo 官方在 locales.md 中对这一机制有统一说明日期、货币、数字与百分比的本地化均由 [bep/golocales] 包执行Hugo 通过配置项locale确定站点语言对应的 locale若未配置则回退到语言键language key本身解析出的值必须是该包所支持的 locale否则无法正确本地化。locale 的四级回退链从源码结构可以确认Hugo 在创建语言实例NewLanguage时langs/language.go按以下顺序尝试解析 translatorfor _, key : range []string{languageConfig.Locale, lang, defaultContentLanguage, en} { if key { continue } if translator golocales.New(key); translator ! nil { break } }即回退顺序为显式配置的locale→ 语言键如nn、de→ 默认内容语言 →en。这也解释了为什么即使某个语言键不被bep/golocales支持最终也会回退到英语格式而不会直接报错——从源码行为看golocales.New返回nil时即尝试下一个候选。如何在配置中指定 localelocale是Language级别的配置项定义于 config/allconfig/allconfig.go从 allconfig.go 的默认逻辑看当locale为空时会以languageCode兜底。典型的多语言配置示例如下完整配置说明可参见 multilingual.mddefaultContentLanguage en [languages] [languages.en] weight 10 [languages.de] weight 20 locale de-DE [languages.nn] weight 30需要特别说明的是locale支持es_ES与es-ES、es_es与es-es等不同写法。针对 Issue 9446 的回归测试证明这四种形式都能被正确解析并得到一致的格式化结果3,142说明解析器对下划线/连字符、大小写均做了兼容处理。多语言站点中的真实效果lang.FormatNumber的价值在多语言站点中体现得最为直观。Hugo 的集成测试 TestLanguageNumberFormatting 在一个同时配置了英语en与新挪威语nn的站点中验证了同一模板在不同语言下的输出差异FormatNumber: {{ 512.5032 | lang.FormatNumber 2 }}两种语言渲染出的public/结果截然不同语言输出说明en512.50英文习惯小数点用.nn新挪威语512,50欧洲大陆习惯小数点用,同一份模板、同一组数据仅因语言环境不同就自动生成了符合当地阅读习惯的数字格式——这正是lang.FormatNumber与写死格式的模板函数之间最本质的区别。类似的单元测试证据见 tpl/lang/lang_test.gonn环境下3.14159265359保留 3 位输出为3,142而en环境下输出3.142。与lang命名空间其他格式化函数的分工lang.FormatNumber并非孤立的函数它与lang命名空间下的一组本地化函数形成完整矩阵全部实现在 tpl/lang/lang.go 中注册于 tpl/lang/init.go函数作用示例输出en 环境lang.FormatNumber按 locale 格式化数字{{ 512.5032 | lang.FormatNumber 2 }}→512.50lang.FormatPercent按 locale 格式化百分比{{ 512.5032 | lang.FormatPercent 2 }}→512.50%lang.FormatCurrency按 locale 格式化货币{{ 512.5032 | lang.FormatCurrency 2 USD }}→$512.50lang.FormatAccounting会计记法货币{{ 512.5032 | lang.FormatAccounting 2 NOK }}→NOK512.50lang.FormatNumberCustom完全自定义符号的格式化{{ lang.FormatNumberCustom 2 12345.6789 }}→12,345.68何时选择FormatNumberCustom如果你的需求是完全脱离语言环境、强制使用指定符号则应改用lang.FormatNumberCustom详见 FormatNumberCustom.md。它通过第一个参数空格分隔的负号、小数点、分组符三字符默认- . ,与可选的第二个分隔符参数实现完全可控的输出{{ lang.FormatNumberCustom 2 12345.6789 }} → 12,345.68 {{ lang.FormatNumberCustom 2 12345.6789 - , . }} → 12.345,68 {{ lang.FormatNumberCustom 6 -12345.6789 - . }} → -12345.678900 {{ lang.FormatNumberCustom 0 -12345.6789 - . , }} → -12,346 {{ lang.FormatNumberCustom 0 -12345.6789 -|.| | }} → -12 346官方文档明确建议对于需要随语言自动适应的场景优先使用lang.FormatNumber即本文主题函数FormatNumberCustom仅在需要固定格式时使用。常见问题与排错建议输出格式不符合预期比如中文站点仍输出512.50检查hugo.toml中该语言是否设置了locale且该值是否为bep/golocales支持的 locale若未配置Hugo 会按语言键 → 默认内容语言 →en的顺序回退此时格式化结果可能与你的预期语言习惯不一致。精度超过 20会直接报错invalid precision请确认PRECISION取值在0~20范围内校验逻辑见 tpl/lang/lang.go。传入了无法转换为数字的值参数转换失败会返回错误建议在模板中确保传入值可被cast.ToFloat64E接受例如float、int或纯数字字符串。小数位补零行为格式化会按精度补足位数如精度 6 时-12345.6789输出-12345.678900可用于对齐显示。验证与测试lang.FormatNumber的行为在仓库中有多层测试保障可作为你验证自己站点行为的参照单元测试 tpl/lang/lang_test.go覆盖nn/en两种语言下π值的格式化结果locale 写法兼容测试 tpl/lang/lang_test.go覆盖es_ES、es_es、es-ES、es-es四种写法端到端集成测试 hugolib/language_test.go在真实多语言站点构建流程中验证en与nn的最终 HTML 输出差异。如果你在自己的多语言站点中遇到数字格式问题不妨先写出一个最小复现模板参照上述测试用例的组织方式分别检查locale配置与各语言的渲染输出通常能快速定位是配置缺失还是 locale 不受支持所致。【免费下载链接】hugoThe world’s fastest framework for building websites.项目地址: https://gitcode.com/gh_mirrors/hu/hugo创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表