← 返回题目列表

Intl API 能解决哪些国际化格式化问题?

中等 第 26 / 29 题 更新于 2026/07/29
JavaScriptIntl国际化

简化版

Intl 是浏览器内置的国际化 API,可以格式化日期、数字、货币、相对时间、列表、复数规则等。它比手写字符串拼接更可靠,因为不同地区的顺序、分隔符、货币符号和复数规则都不同。

常用对象包括 Intl.DateTimeFormatIntl.NumberFormatIntl.RelativeTimeFormatIntl.Collator

详细版

const price = new Intl.NumberFormat("zh-CN", {
  style: "currency",
  currency: "CNY"
}).format(12345.6);

console.log(price); // ¥12,345.60

日期格式化:

const text = new Intl.DateTimeFormat("en-US", {
  dateStyle: "medium",
  timeZone: "Asia/Shanghai"
}).format(new Date("2026-07-29T00:00:00Z"));

排序:

const collator = new Intl.Collator("zh-CN");
["张三", "李四"].sort(collator.compare);

工程上不要在渲染循环里反复创建 formatter,应该复用实例。

完整版教学

一、国际化不只是翻译文案

i18n 包括语言、日期、数字、货币、排序、复数、时区、书写方向等。

手写 "¥" + amount.toFixed(2) 看起来简单,但在多地区场景会很快失控。

Intl 的价值是把区域规则交给运行环境,而不是把所有格式规则写死在业务代码里。

二、NumberFormat 处理数字和货币

const cn = new Intl.NumberFormat("zh-CN");
const us = new Intl.NumberFormat("en-US");

console.log(cn.format(1234567.89));
console.log(us.format(1234567.89));

货币格式:

new Intl.NumberFormat("en-US", {
  style: "currency",
  currency: "USD"
}).format(99.9);
场景推荐 API
普通数字Intl.NumberFormat
货币Intl.NumberFormat + currency
百分比Intl.NumberFormat + percent

三、DateTimeFormat 处理日期和时区

日期顺序在不同地区不同。

const date = new Date("2026-07-29T08:00:00Z");

new Intl.DateTimeFormat("zh-CN", {
  dateStyle: "full",
  timeZone: "Asia/Shanghai"
}).format(date);

明确传 timeZone 可以避免服务器、用户浏览器、测试环境时区不同导致展示不一致。

四、RelativeTimeFormat 处理相对时间

const rtf = new Intl.RelativeTimeFormat("zh-CN", {
  numeric: "auto"
});

rtf.format(-1, "day"); // 昨天
rtf.format(3, "minute"); // 3分钟后

相对时间不要简单拼接“前”和“后”,不同语言的语序可能不同。

五、Collator 处理本地化排序和比较

字符串排序不是简单比较 Unicode 编码。

const names = ["张三", "李四", "王五"];
const collator = new Intl.Collator("zh-CN");

names.sort(collator.compare);

对于搜索、表格排序、通讯录等场景,Intl.Collator 比默认 sort 更符合用户预期。

六、性能和兼容性注意

创建 formatter 有成本,列表渲染里应复用。

const formatter = new Intl.NumberFormat("zh-CN");

items.map(item => formatter.format(item.amount));

兼容性方面,现代浏览器基本支持核心 Intl,但具体 locale 数据和较新的 API 仍要看目标环境。

七、常见误区与追问

  • 误区:国际化就是把中文替换成英文。 日期、数字、货币、排序和复数规则也属于国际化。
  • 误区:金额格式可以手写符号拼接。 不同地区的符号位置、小数位和分组规则不同。
  • 误区:默认时区展示一定符合业务。 跨地区产品应明确时区语义。
  • 误区:每次 render 创建 formatter 没影响。 大列表中反复创建会有额外成本。
  • 追问:Intl.Collator 解决什么问题? 它用于按本地语言规则比较和排序字符串。
  • 追问:为什么相对时间不建议自己拼接? 不同语言语序和复数规则不同。

八、加强记忆

按功能记:

number / currency -> NumberFormat
date / timezone   -> DateTimeFormat
relative time     -> RelativeTimeFormat
sort / compare    -> Collator

回答时从“国际化不只是翻译”开场,再给数字、日期、相对时间和排序四个例子,最后补复用 formatter 与明确时区的工程注意点。