Vitest中Number.toLocaleString(pt-BR)转换失败问题
本地化货币转换函数的pt-BR测试失败问题
我写了一个toCurrency函数,用来把字符串或数字转换成符合本地化格式的货币字符串,代码如下:
function toCurrency( value: string | number, locale: string = "pt-BR", currency: string = "BRL", options?: Intl.NumberFormatOptions ) { return Number(value).toLocaleString(locale, { maximumFractionDigits: 2, style: "currency", currency: currency, ...options, }); }
同时配套写了Vitest测试用例:
describe("toCurrency", () => { test("toCurrency defined", async () => { expect(toCurrency).toBeDefined(); }); test("toCurrency", () => { const result = toCurrency(1, "pt-BR", "BRL"); expect(result).toEqual("R$ 1,00"); }); test("toCurrency USD", () => { const result = toCurrency(1, "en-US", "USD"); expect(result).toEqual("$1.00"); }); });
但只有pt-BR(巴西葡萄牙语)环境下的测试会失败,失败截图如下:
可能的原因及解决办法
Node.js环境Intl本地化数据不全
部分Node.js版本默认的Intl实现没有包含完整的pt-BR本地化数据,导致格式输出不符合预期。可以尝试升级Node.js到16.x及以上版本,新版本对Intl的支持更完善。缺少最小小数位数配置
当前函数只设置了maximumFractionDigits: 2,但pt-BR本地化环境默认的最小小数位数可能不是2,导致输出格式异常。修改函数,添加minimumFractionDigits: 2:
function toCurrency( value: string | number, locale: string = "pt-BR", currency: string = "BRL", options?: Intl.NumberFormatOptions ) { return Number(value).toLocaleString(locale, { minimumFractionDigits: 2, maximumFractionDigits: 2, style: "currency", currency: currency, ...options, }); }
- 测试预期的格式细节差异
不同环境下的Intl输出可能有细微差别,比如货币符号和数字之间的空格。可以先打印实际输出结果,再调整测试断言。例如如果实际输出是R$1,00(无空格),就把测试断言改成:
expect(result).toEqual("R$1,00");
- 补充本地化数据
如果升级Node.js后问题仍存在,可以安装@formatjs/intl-numberformat及其对应的pt-BR locale包来补充数据:
npm install @formatjs/intl-numberformat @formatjs/intl-numberformat/locale-data/pt
然后在代码中引入:
import '@formatjs/intl-numberformat/polyfill'; import '@formatjs/intl-numberformat/locale-data/pt';
内容的提问来源于stack exchange,提问作者hgodinho
相关产品推荐
相关产品推荐

